【问题标题】:SwiftUI NavigationLink double click on List MacOSSwiftUI NavigationLink 双击 List MacOS
【发布时间】:2020-11-12 06:33:03
【问题描述】:

在 MacOS 的列表中双击 NavigationLink 时,谁能想到如何调用操作?我已尝试添加 onTapGesture(count:2),但它没有达到预期的效果,并覆盖了可靠选择链接的能力。

var body: some View {
    NavigationView {
        List {
            ForEach(items) { item in
                NavigationLink(destination: Item(itemDetail: item)) {
                    ItemRow(itemRow: item) //<-my row view
                }.buttonStyle(PlainButtonStyle())
                 .simultaneousGesture(TapGesture(count:2)
                 .onEnded {
                     print("double tap")
                })
            }
        }
    }
}

编辑:

我在 NavigationLink 中设置了一个标签/选择,现在可以双击或单击该行的内容。唯一的问题是,虽然显示了 itemDetail 视图,但带有重音符号的“活动”状态并没有出现在链接上。有没有办法设置活动状态(突出显示状态)或扩展 NavigationLink 功能以接受双击和单击?

@State var selection:String?
var body: some View {
    NavigationView {
        List {
            ForEach(items) { item in
                NavigationLink(destination: Item(itemDetail: item), tag: item.id, selection: self.$selection) {
                    ItemRow(itemRow: item) //<-my row view
                }.onTapGesture(count:2) { //<- Needed to be first!
                    print("doubletap")
                }.onTapGesture(count:1) {
                    self.selection = item.id
                }
            }
        }
    }
}

【问题讨论】:

    标签: swiftui double-click navigationview swiftui-navigationlink


    【解决方案1】:

    寻找类似的解决方案我尝试了@asperi 答案,但与原始海报的可点击区域有相同的问题。在尝试了许多变化之后,以下对我有用:

    @State var selection: String?
    ...
    NavigationLink(destination: HistoryListView(branch: string), tag: string, selection: self.$selection) {
      Text(string)
        .gesture(
          TapGesture(count:1)
            .onEnded({
              print("Tap Single")
              selection = string
            })
        )
        .highPriorityGesture(
          TapGesture(count:2)
            .onEnded({
              print("Tap Double")
            })
        )
    }
    

    【讨论】:

      【解决方案2】:

      使用同步手势,如下所示(使用 Xcode 11.4 / macOS 10.15.5 测试)

      NavigationLink(destination: Text("View One")) {
          Text("ONE")
      }
      .buttonStyle(PlainButtonStyle())        // << required !!
      .simultaneousGesture(TapGesture(count: 2)
          .onEnded { print(">> double tap")})
      

      或者.highPriorityGesture(...如果你需要双击有更高的优先级

      【讨论】:

      • 不幸的是,这似乎对我有非此即彼的影响。链接内的视图变为可双击但为了更新列表的活动选择,我必须选择行中未填充的部分。我将编辑我的问题以显示代码。
      • 如果有一种方法可以覆盖 NavigationLink 的内置手势,这样它就可以在整个行中执行双击操作,而不会干扰显示视图的原始功能。