Когда нужно показать список данных, особенно длинный список, использование
Table в SwiftUI — отличный выбор. Однако иногда вы можете заметить, что при использовании Table базовое взаимодействие с ним не совсем такое, какое хотелось бы. Например, строка таблицы может не казаться кликабельной или не обрабатывать события выбора так, как вы ожидали.В этом посте мы рассмотрим, как сделать строки
Table в SwiftUI интерактивными и реагирующими на пользовательские действия.Проблема
Когда вы используете
Table в SwiftUI, вы можете ожидать, что строки будут интерактивными и позволят пользователю выбирать их. Однако по умолчанию, особенно на macOS, строки могут выглядеть пассивно: клики по ним не обрабатываются так, как хотелось бы, и события выбора не происходят.Вот простой пример использования
Table:
struct Person: Identifiable {
var id = UUID()
var name: String
var age: Int
}
struct ContentView: View {
var people = [
Person(name: "Alice", age: 30),
Person(name: "Bob", age: 25)
]
var body: some View {
Table(people) {
TableColumn("Name", value: \.name)
TableColumn("Age", value: \.age)
}
}
}
В этом примере строки будут отображаться, но никакого выбора пользователя не будет.
Решение
Чтобы добавить возможность выбора строк, вы должны предоставить
selection биндинг для Table. Таким образом Table будет знать, какие строки выбраны.Вот обновленная версия примера:
struct ContentView: View {
@State private var selectedPerson: Person.ID?
var people = [
Person(name: "Alice", age: 30),
Person(name: "Bob", age: 25)
]
var body: some View {
Table(people, selection: $selectedPerson) {
TableColumn("Name", value: \.name)
TableColumn("Age", value: \.age)
}
}
}
Теперь пользователь сможет кликать по строкам и выбирать их. Переменная
selectedPerson будет содержать идентификатор выбранного элемента.Если вы хотите разрешить множественный выбор, вместо одного
ID вы можете использовать Set<ID>:
@State private var selectedPeople = Set<Person.ID>()
И затем передавать биндинг
selection: $selectedPeople.Реакция на выбор
Чтобы реагировать на выбор пользователя, вы можете использовать
onChange модификатор:
.onChange(of: selectedPerson) { newSelection in
if let selected = newSelection {
print("Выбран человек с ID: \(selected)")
}
}
Вывод
Хотя
Table в SwiftUI изначально может не выглядеть полностью интерактивным, добавление биндинга для selection позволяет легко улучшить взаимодействие пользователя. Это делает строки таблицы кликабельными и позволяет обрабатывать выбор данных.https://www.createwithswift.com/enabling-interaction-with-table-view-in-swiftui/
#ios
👉 @developer_mobila
