SwiftUI macOS 双击列表项

Posted

技术标签:

【中文标题】SwiftUI macOS 双击列表项【英文标题】:SwiftUI macOS double tap list item 【发布时间】:2020-10-10 13:02:09 【问题描述】:

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

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”:

第一个警报:

第二个警报:

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

【问题讨论】:

【参考方案1】:

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

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

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)
    

【讨论】:

以上是关于SwiftUI macOS 双击列表项的主要内容,如果未能解决你的问题,请参考以下文章

macOS 上的 SwiftUI:带有详细视图和多选的列表

SwiftUI macOS 在 TextField 处于活动状态时使用箭头键滚动列表

按返回键“不”关闭软件键盘 - SwiftUI

SwiftUI MacOS 列表的 Inset 填充

在 swiftUI 列表中添加、选择和删除文件名 - MacOS

macOS 上的 SwiftUI:如何为 onDelete 启用 UI(从列表中删除)