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

问题描述 投票:0回答:1

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

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

以下代码可以在 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
1个回答
0
投票

适合我选择行的解决方法是将选择作为绑定传递到行视图,并添加单个 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)")
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.