#ios #swift #swiftui
#iOS #swift #swiftui
Вопрос:
Я хочу в основном сделать didSelectRow
как UITableView
в SwiftUI.
Это код:
struct ContentView: View {
var testData = [Foo(name: "1"),
Foo(name: "2"),
Foo(name: "3"),
Foo(name: "4"),
Foo(name: "5")]
@State var selected: Foo?
var body: some View {
NavigationView {
VStack {
List(testData, id: .name, selection: $selected) { foo in
HStack {
Text(foo.name)
}
}.navigationBarTitle("Selected (selected?.name ?? "")")
Button("Check:") {
print(selected?.name)
}
}
}
}
Я подумал, что если я щелкну ячейку, то selected
должен содержать выбранное значение, но это не так. selected
Не имеет значения. И ячейка не кликабельна.
Поэтому я добавил Button
.
NavigationView {
VStack {
List(testData, id: .name, selection: $selected) { foo in
HStack {
Text(foo.name)
Button("Test") {
print("(foo) is selected.")
print(selected?.name)
}
}
}.navigationBarTitle("Selected (selected?.name ?? "")")
Button("Check:") {
print(selected?.name)
}
}
Теперь щелчок работает, но на самом деле foo
это тот, который я хочу, нет необходимости selected
, почему selection
List
здесь.
Не уверен, что я что-то пропустил. Должен Button
ли быть необходим для List
« didSelectRow
«? Спасибо!
Редактировать
После небольшого исследования мой текущий вывод:
- Для одиночных выборок нет необходимости вызывать
List(.. selection:)
. Но вы должны использоватьButton
илиOnTapGesture
для интерактивного. List(.. selection:)
предназначен только для режима редактирования, который представляет собой множественный выбор, как вы можете видетьselection:
, требуется набор. Мой пример должен быть@State var selected: Set<Foo>?
Ответ №1:
На iOS выбор работает в режиме редактирования по дизайну
/// Creates a list with the given content that supports selecting multiple
/// rows.
///
>> /// On iOS and tvOS, you must explicitly put the list into edit mode for
>> /// the selection to apply.
///
/// - Parameters:
/// - selection: A binding to a set that identifies selected rows.
/// - content: The content of the list.
@available(watchOS, unavailable)
public init(selection: Binding<Set<SelectionValue>>?, @ViewBuilder content: () -> Content)
поэтому вам нужно либо EditButton
куда-то добавить, либо активировать режим редактирования программно, например
List(selection: $selection) {
// ... other code
}
.environment(.editMode, .constant(.active)) // eg. persistent edit mode
Обновление: вот демонстрация выбора списка SwiftUI по умолчанию
struct DemoView: View {
@State private var selection: Set<Int>?
@State private var numbers = [0,1,2,3,4,5,6,7,8,9]
var body: some View {
List(selection: $selection) {
ForEach(numbers, id: .self) { number in
VStack {
Text("(number)")
}
}.onDelete(perform: {_ in})
}
.environment(.editMode, .constant(.active))
}
}
Комментарии:
1. Добавлен
.environment(.editMode, .constant(.active))
, но по-прежнему не может щелкнуть ячейку.