SwiftUI - если внутри цикла ForEach - PullRequest
1 голос
/ 26 марта 2020

Я строю Список на основе своих элементов в массиве, который я извлек до этого.

Я выбираю все объекты ... Когда пользователь выполняет поиск в строке поиска, я хочу отфильтровать свой Список , Я НЕ делаю новый запрос 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 l oop. В этом l oop я хочу решить, показать ли мне этот элемент или нет. Проблема в том, что даже если я не хочу показывать элемент, в моем списке все еще есть небольшое представление. Я знаю , почему , это потому, что я все еще отрисовываю 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 ]

3 голосов
/ 26 марта 2020

фильтруйте ваши данные ДО того, как передать их в конструктор ForEach.

ForEach(self.documentItems.filter {self.checkSearchString(document: $0)}, id: \.self) { document in
    HStack(spacing: 0)
        {
            ListRow(document: document).tag(document)
        }
}
2 голосов
/ 26 марта 2020

Вам нужно использовать Group для переноса различных представлений, предоставленных условием, как показано ниже

 ForEach(self.documentItems, id: \.self) { document in
   Group {
     if (self.checkSearchString(document: document))
     {
         HStack(spacing: 0)
         {
             ListRow(document: document).tag(document)
         }
     }
     else 
     {
        EmptyView()
     }
   }
 }
1 голос
/ 26 марта 2020
List(selection: $selectedDocument)
{
    ForEach(self.documentItems, id: \.self) { document in

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

    }

Извлеките ваш hstack и используйте тринарий с пустым представлением. Дайте мне знать, если это работает, я сделал это из памяти нет IDE на этом компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...