SwiftUI-如果在ForEach循环中

时间:2020-03-26 11:38:27

标签: swift macos swiftui

我正在基于之前获取的数组中的元素构建列表。

我正在获取所有实体..当用户在搜索栏中进行搜索时,我想过滤我的列表。我不是在做一个新的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)
             }
         }

谢谢!

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

List(selection: $selectedDocument)
{
    ForEach(self.documentItems, id: \.self) { document in

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

    }

提取您的hstack并使用具有空视图的三元组。让我知道这是否可行,我是从这台计算机上没有IDE的内存中完成的。