SwiftUI macOS двойное касание элемента списка - PullRequest
1 голос
/ 20 июня 2020

Я хотел бы иметь разделенный просмотр с элементами в подробном представлении, которые можно было бы нажимать дважды. Я создал следующий пример, чтобы продемонстрировать свою проблему:

struct ContentView: View {
var body: some View {
    NavigationView {
        List(["Hello", "World"]) { str in
            NavigationLink(destination: DetailView(title: str)) {
                Text(str)
            }
        }
    }.frame(minWidth: 300, minHeight: 300)
  }
}

struct DetailView: View {

    let title: String
    @State var isShowingAlert = false

    var body: some View {
        VStack {
            Text(title)
            List(["This", "is", "SwiftUI", "!"]) { str in
                Text(str).onTapGesture(count: 2) {
                self.isShowingAlert = true
            }.alert(isPresented: self.$isShowingAlert) { () -> Alert in
                Alert(title: Text(str), message: Text("This is a hello message"), dismissButton: Alert.Button.default(Text("Ok")))
            }
        }
    }.frame(minWidth: 200)
  }
}

Итак, часть splitview работает должным образом. Но когда я дважды нажимаю на элемент строки, он всегда показывает мне предупреждение дважды с содержимым ниже. Так что не имеет значения, какой элемент я нажимаю. Он всегда показывает мне первый и второй элементы в предупреждении. После отклонения первого предупреждения с заголовком «Это» отображается второе с заголовком «is»:

Первое предупреждение: The first alert shown after tapping any item in the list

The second alert: Второе предупреждение отображается после закрытия первого предупреждения

Почему показывает два предупреждения по одному двойному нажатию? И почему всегда первые два элемента, даже если я выбираю последний элемент в списке? Есть предложения или решения? Большое спасибо :)

1 Ответ

1 голос
/ 20 июня 2020

Вы создаете множество предупреждений, прикрепляя по одному к каждой строке списка, и активируете их все, переключая одно состояние ... последствия фактически непредсказуемые.

Вместо этого это должно быть только одно предупреждение, управляемое собственным состоянием. Итак, вот возможное решение:

struct DetailView: View {

    let title: String
    @State private var selectedItem: String = ""
    @State private var isShowingAlert = false

    var body: some View {
        VStack {
            Text(title)
            List(["This", "is", "SwiftUI", "!"]) { str in
                Text(str).onTapGesture(count: 2) {
                    self.selectedItem = str        // << store clicked raw item
                    self.isShowingAlert = true     // << activate alert !!
                }
            }
            .alert(isPresented: self.$isShowingAlert) { // << attach here !!
                Alert(title: Text(self.selectedItem), message: Text("This is a hello message"), dismissButton: Alert.Button.default(Text("Ok")))
            }
        }.frame(minWidth: 200)
    }
}
...