在 MacOS 上的 SwiftUI 中,检测列表中的点击和双击

In SwiftUI on MacOS Detect Clicks and Doubleclicks in List

提问人:mica 提问时间:8/20/2023 最后编辑:mica 更新时间:8/21/2023 访问量:48

问:

我有一个有几行的列表。
线条包含两个可单击的图像和一些文本。

单击或双击图像将触发操作。
单击“行”中的其他任何位置将选择“列表中的行”。
双击行中的其他任何位置将触发操作。

以下代码适用于 iOS,要做什么,它适用于 MacOS。

在MacOS(13.4.1(c)(22F770820d))中,我有这样的效果,即单击一下即可选择行无法正常工作。

struct Line_List: View {
  @State private var selectedRow: Int? = nil
  var body: some View {
    List(1..<11, id: \.self, selection: $selectedRow) { index in
      Line(index: index)
    }
  }
}

struct Line: View {
  var index: Int
  
  var body: some View {
    HStack (alignment: .top) {
      Image(systemName: "1.circle.fill")
        .onTapGesture (count: 2){
          print("Icon 1 Double-Clicked")
        }
        .onTapGesture (count: 1){
          print("Icon 1 Single-Clicked")
        }        
      VStack (alignment: .leading){
        Text("Line: \(index)")
        Text("Some other Text")
      }
      Spacer()
      Image(systemName: "2.circle.fill")
        .onTapGesture (count: 2){
          print("Icon2 Double-Clicked")
        }
        .onTapGesture (count: 1){
          print("Icon2 Single-Clicked")
        }
      
    }
    .background(Color.green)
    .onTapGesture(count: 2) {  // does not work in MacOS
      print("Line Double-Clicked")
    }   
  }
}

SwiftUI Swift3

评论

0赞 Hongtron 8/20/2023
在 Ventura 上对我来说似乎工作正常。
0赞 mica 8/20/2023
@Hongtron尝试一下点击,那么线条的选择就不起作用了,我会在帖子中澄清这一点
0赞 Hongtron 8/21/2023
我现在看到了这个问题。单击该行不会选择,除非您在黑色分隔符的边缘/中单击右键。

答:

0赞 Hongtron 8/21/2023 #1

适合我选择行的解决方法是将所选内容作为绑定传递给 Line 视图,并添加单个 onTapGesture 以将选择绑定更改为索引值。我敢肯定这与拾取 tapGesture 的层有关。将两者都放在背景颜色上可以确定单击和双击。

struct Line: View {
  var index: Int
    @Binding var selectedRow: Int? // <- Adding a binding to the selection
  
  var body: some View {
    HStack (alignment: .top) {
      Image(systemName: "1.circle.fill")
        .onTapGesture (count: 2){
          print("Icon 1 Double-Clicked")
        }
        .onTapGesture (count: 1){
          print("Icon 1 Single-Clicked")
        }
      VStack (alignment: .leading){
        Text("Line: \(index)")
        Text("Some other Text")
      }
      Spacer()
      Image(systemName: "2.circle.fill")
        .onTapGesture (count: 2){
          print("Icon2 Double-Clicked")
        }
        .onTapGesture (count: 1){
          print("Icon2 Single-Clicked")
        }
    }
    .background(Color.green)
    .onTapGesture(count: 2) {  // does not work in MacOS
        print("Line \(index.description) Double-Clicked")
    }
    .onTapGesture(count: 1) {  // <- Add This
        selectedRow = index
        print("Selected Line is \(index.description)")
    }
  }
}