#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!)
}