Выбор списка SwiftUI не имеет значения

#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)) , но по-прежнему не может щелкнуть ячейку.