程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Swift UI:如何在视图中显示空列表时显示错误消息?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Swift UI:如何在视图中显示空列表时显示错误消息??

开发过程中遇到Swift UI:如何在视图中显示空列表时显示错误消息?的问题如何解决?下面主要结合日常开发的经验,给出你关于Swift UI:如何在视图中显示空列表时显示错误消息?的解决方法建议,希望对你解决Swift UI:如何在视图中显示空列表时显示错误消息?有所启发或帮助;

我有一个按字母顺序组织成组的 Terms@H_301_2@ 集合。下面的 Swift UI 代码将集合显示为一个 List@H_301_2@,按组划分为多个部分。每个组都根据(可能为空)搜索字符串进行过滤。所以显示的列表要么包含整个 Terms@H_301_2@ 集合,一个基于搜索字符串的子集,要么什么都不包含(如果搜索失败):

    var body: some VIEw {
        List() {
                        
            ForEach(terms.groups) { group in
                let groupTerms = filteredTerms(for: group)
                
                if searchText.isEmpty || !groupTerms.isEmpty {
                    Section(header: Text(group.Name)) {
                        ForEach(groupTerms) { term in
                            Navigationlink(desTination: DetailVIEw(term: term)) {
                                TermsRow(term: term)
                            }
                        }
                    }
                }
            }
        }
    }
@H_301_2@

问题是:我如何显示搜索失败的消息,而不仅仅是一个空屏幕?只能在外部 ForEach@H_301_2@ 循环完成且所有 groupTerms@H_301_2@ 为空后才能确定搜索失败,但我无法捕获该信息 - Swift 不喜欢它,如果如果任何 searchSucceeded@H_301_2@ 非空,我在 ForEach@H_301_2@ 循环中粘贴一个 true@H_301_2@ 布尔值以设置为 groupTerms@H_301_2@,如下所示:

    var searchSucceeded = false     
    var body: some VIEw {
        List() {
            
            ForEach(terms.groups) { group in
                let groupTerms = filteredTerms(for: group)
                
                if searchText.isEmpty || !groupTerms.isEmpty {
                    Section(header: Text(group.Name)) {
                        ForEach(groupTerms) { term in
                            Navigationlink(desTination: DetailVIEw(term: term)) {
                                TermsRow(term: term)
                            }
                        }
                    }
                }  else if !searchText.isEmpty && !groupIdioms.isEmpty {
                    searchSucceeded = true           
                }
            }
            // display message here if searchSucceeded is false
        }
    }
@H_301_2@

此代码不会在赋值给 searchSucceeded@H_301_2@ 的情况下编译。我是 Swift UI 新手。最初的代码是由另一位不再可用的开发人员编写的。我希望有人能在这里帮助我。

解决方法

与其尝试在 searchSucceeded 中设置 ForEach,不如创建一个名为 displayError 的计算属性来确定是否应显示错误。每次渲染视图时都会重新计算计算属性,这会受到新属性、@State 更改等的影响。

var displayError : Bool {
    //condition here -- map? reduce?
    return true
}

var body: some View {
    List() {
        ForEach(terms.groups) { group in
            let groupTerms = filteredTerms(for: group)
            if searchText.isEmpty || !groupTerms.isEmpty {
                Section(header: Text(group.Name)) {
                    ForEach(groupTerms) { term in
                        NavigationLink(desTination: DetailView(term: term)) {
                            TermsRow(term: term)
                        }
                    }
                }
            }
        }
        
        if DisplayError {
            Text("error message")
        }
    }
}

您还没有包含您的模型代码,因此很难说要在该计算属性中放入什么,但从您的循环来看,它可能是一个 reduce 或可迭代您的组的内容并查看是否有有效数据。

就像评论中提到的@lorem 一样,您可以将这种东西移动到视图模型中,但这并不是绝对必要的。如果您拥有大量数据并且出于资源原因想要限制通过数据的次数,则这可能会变得更加重要。

,

对于这样的情况 - 你必须绘制“这个”或“那个”,它们有很大的不同,我使用一个“EitherView”和一个相应的模型“Either”:

struct EitherView<Right: ComponentView,Left: ComponentView>: ComponentView {
    var state: Either<Right.State,Left.State>

    init(_ state: Either<Right.State,Left.State>) {
        self.state = state
    }

    var body: some View {
        switch state {
        case .right(let right):
            Right(right)
        case .left(let left):
            Left(left)
        }
    }
}
public enum Either<Right,Left> {
    case right(Right)
    case left(Left)
}

然后您可以添加模态呈现的视图和加载指示器,如下面示例所示,旨在实现一个可重复使用的通用视图:

struct MyView<ContentView: ComponentView>: View {
    typealias Content = ContentView.State
    typealias Modal = ModalState<AlertState,SheetState,ActionSheetState,LoadingState>
    private var state: ViewState<Content,Modal>

    init(_ state: ViewState<Content,Modal>) {
        self.state = state
    }

    var body: some View {
        return GeometryReader { geometry in
        ContentView(state.body)
        .frame(width: geometry.size.width,height: geometry.size.height,alignment: .center)
        }
        .alert(item: showAlert) { alert in
            SwiftUI.Alert(title: Text(alert.titlE),message: Text(alert.messagE))
        }
        .sheet(item: showSheet) { sheet in
            ...
        }
        .actionSheet(item: showActionSheet) { actionSheet in
            SwiftUI.ActionSheet(title: Text(actionSheet.titlE))
        }
    }
}
private extension MyView {
    var showAlert: Binding<AlertState?> {
        Binding<AlertState?>(
            get: { self.state.alert },set: { _ in self.state.dismiss() }
        )
    }
  ... 
}

请注意,此示例中的视图状态不可变。

为了将此应用于您的问题,您只需要组合相应的 @H_727_46@model 或 viewState,最好在视图之外,例如在 viewModel 中。 >

现在您已将大问题分解为小块,每个小块都很容易解决。

大佬总结

以上是大佬教程为你收集整理的Swift UI:如何在视图中显示空列表时显示错误消息?全部内容,希望文章能够帮你解决Swift UI:如何在视图中显示空列表时显示错误消息?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: