[英]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.