Взаимодействие с Table View в SwiftUI
Когда нужно показать список данных, особенно длинный список, использование 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
>>Click here to continue<<
