繁体   English   中英

SwiftUI macOS双击列表项

[英]SwiftUI macOS double tap list item

我想要一个拆分视图,其中包含可双击的详细视图中的项目。 我创建了以下示例来展示我的问题:

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 部分按预期工作。 但是当我双击一个行项目时,它总是向我显示两次警报,内容如下。 所以我点击哪个项目并不重要。 它总是向我显示警报中的第一项和第二项。 关闭标题为“This”的第一个警报后,第二个标题显示为“is”:

第一个警报: 点击列表中的任何项目后显示的第一个警报

第二个警报: 关闭第一个警报后显示的第二个警报

为什么双击会显示两个警报? 即使我 select 是列表中的最后一项,为什么总是前两项? 有什么建议或解决方案吗? 非常感谢:)

您通过将一个附加到每个列表行来创建许多警报,并通过切换一个 state 来激活所有警报......后果实际上是不可预测的。

相反,它应该只是一个由自己的 state 管理的警报。 所以这是可能的解决方案:

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)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM