SwiftUI — Как получить выбранный индекс списка при поиске?

#swift #swiftui #swiftui-list

#swift #swiftui #swiftui-список

Вопрос:

У меня есть список в SwiftUI, но проблема в том, что у меня есть окно поиска.

Мой код выглядит так:

   List {
    
    ForEach(items.filter {
      self.searchText.isEmpty ? true : $0.term!.contains(self.searchText)
    }, id: .self) { item in
      Text(item.term!)
    }
    .onDelete(perform: deleteItems)
    .onTapGesture(count: 1, perform: {
      selectedItem = index // 1
    })
  }
  

Мне нужно получить индекс выбранного элемента из этого списка, когда элемент выбран.

Видите строку //1? Как мне получить index там.

Комментарии:

1. List имеет привязку выбора, это то, что вам нужно?

2. что вы имеете в виду? извините, я новичок в swift.

3. Неважно — лучший ответ ниже.

Ответ №1:

Если я правильно понял вашу цель (и элемент приравнивается), то это можно сделать с помощью

 }, id: .self) { item in
  Text(item.term!)
    .frame(maxWidth: .infinity, maxHeight: .infinity)
    .contentShape(Rectangle())
    .onTapGesture {
        // above makes complete row tappable inside dynamic content
        // so you have access here to item to find index
        selectedItem = items.firstIndex { $0 == item }
    }
}
.onDelete(perform: deleteItems)
  

Комментарии:

1. С этим подходом есть проблема. Вы добавили onTapGesture в текст, поэтому текст является единственным доступным элементом. Поскольку текст находится в «табличном представлении», ячейка не будет открываться, только текст, что не интуитивно понятно. Вернуться к нулевому квадрату.

2. Вероятно, вы забыли адаптировать frame/contentShape модификаторы — они делают доступным весь необработанный текст, а не только текст.

Ответ №2:

Решение Aperi не очень хорошо, потому что единственными элементами, которые можно использовать, будут тексты, а не ячейки.

Правильный ответ — обернуть Text элемент в виде кнопки, как показано на этом видео

 Button(action: {
  // do something()            
}) {
   Text(item.term!)
}