SwiftUI - 如果在 ForEach 循环内

Posted

技术标签:

【中文标题】SwiftUI - 如果在 ForEach 循环内【英文标题】:SwiftUI - If inside ForEach loop 【发布时间】:2020-03-26 11:38:27 【问题描述】:

我正在根据我之前获取的数组中的元素构建一个列表。

我正在获取所有实体。当用户在搜索栏中进行搜索时,我想过滤我的列表。我不是在做一个新的 FetchRequest,我只是想过滤我的对象。

这是我目前正在使用的代码:

List(selection: $selectedDocument)

    ForEach(self.documentItems, id: \.self)  document in
        HStack(spacing: 0)
        
            if (self.checkSearchString(document: document))
            
                ListRow(document: document).tag(document)
            
    

我有一个列表,然后是我的 ForEach 循环。在那个循环中,我想决定是否显示该元素。问题是,即使我不想显示元素,我的列表中仍然有一个小视图。我知道为什么,因为我仍然渲染那个HStack()。 我基本上需要将HStack() 拖到我的If 中,但这对我不起作用。我认为这是因为我需要在我的列表中呈现一个视图。但是我怎样才能继续我的ForEach 而不渲染一些东西。

这就是我想要实现的目标,但它不起作用:

 List(selection: $selectedDocument)
 
     ForEach(self.documentItems, id: \.self)  document in
         if (self.checkSearchString(document: document))
         
             HStack(spacing: 0)
             
                 ListRow(document: document).tag(document)
             
         

提前致谢!

【问题讨论】:

【参考方案1】:

在将数据传递给 ForEach 构造函数之前对其进行过滤。

ForEach(self.documentItems.filter self.checkSearchString(document: $0), id: \.self)  document in
    HStack(spacing: 0)
        
            ListRow(document: document).tag(document)
        

【讨论】:

【参考方案2】:

您需要使用Group 来包装条件提供的不同视图,如下所示

 ForEach(self.documentItems, id: \.self)  document in
   Group 
     if (self.checkSearchString(document: document))
     
         HStack(spacing: 0)
         
             ListRow(document: document).tag(document)
         
     
     else 
     
        EmptyView()
     
   
 

【讨论】:

返回 EmptyView() 是否隐藏 ForEach 项?【参考方案3】:
List(selection: $selectedDocument)

    ForEach(self.documentItems, id: \.self)  document in

       self.checkSearchString(document: document) ?  extractedHstack() : emptyView()

    

提取您的 hstack 并使用带有空视图的三元组。让我知道这是否可行,我是在这台计算机上没有 IDE 的内存中执行此操作的。

【讨论】:

我们试过了......当我们像这样使用它时它可以工作 self.checkSearchString(document: document) ? EmptyView() : EmptyView() 但是如果我们将第一个 EmptyView() 替换为我们的视图,它就不再工作了

以上是关于SwiftUI - 如果在 ForEach 循环内的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中按钮操作内的 ForEach 循环?

如何在 SwiftUI 的 foreach 循环中设置切换状态

SwiftUI 将几何阅读器与 ForEach 结合使用

ForEach 中的 SwiftUI 索引超出范围

SwiftUI-自定义容器

如何在 forEach 循环中删除一个项目,每个项目都有一个 delete btn。我将 swiftUI 与核心数据一起使用