1

我有以下导航链接:

NavigationLink(destination:
         TrendSlider(
            title: .constant(title),
             col: .constant(self.dataModel.queryColumnSeasonWinPercentageTeam1),
             opIndx: self.$dataModel.seasonWinPercentageTeam1OperatorIndxValue,
             val: self.$dataModel.seasonWinPercentageTeam1SliderValue,
             lBound: .constant(self.dataModel.seasonWinPercentageTeam1Values.first!) ,
             uBound: .constant(self.dataModel.seasonWinPercentageTeam1Values.last!),
             lRange: self.$dataModel.seasonWinPercentageTeam1RangeSliderLowerValue ,
             uRange: self.$dataModel.seasonWinPercentageTeam1RangeSliderUpperValue,
             step: .constant(1.0),
             displayReadableQuery: $readableQuery

   )) {
       HStack {
          if readableQuery.hasSuffix("IS ANY") {
                Text(title)
                Spacer()
                Text("IS ANY").foregroundColor(Color("TPLightGrey"))
            }else{
                Text(readableQuery).foregroundColor(Color("TPOrange"))

            }
       }
   }.simultaneousGesture(TapGesture().onEnded{
       sendViewSelectionEvent(name: self.title, referral: "Game")

   })

如果我离开“.simultaneousGesture ...”,则点击文本元素不会触发 NavigationLink 操作,但该行的其余部分确实有效。

如果我删除 .simultaneousGesture,则可以再次在任何地方点击该行。

漏洞?

4

2 回答 2

5

添加.simultaneousGesture(:)调用是在 的标签上创建点击手势识别器NavigationLink,而不是在行本身上。关于手势识别器的两个事实解释了观察到的行为。

  1. 的标签NavigationLink实际上位于列表/表单行的上方(见图),这意味着它现在会在任何点击到达列表/表单行之前拦截它们。
  2. 不透明度为 0 的视图的任何部分都不会拦截点击,允许它通过下一个手势识别器;在这种情况下,列表/表单行。

因此,当您点击其中一个文本视图时,点击由TapGesure.onEnded()闭包处理。但是当您点击中间的空间时,点击“通过”并由列表/表单行上的识别器处理,触发NavigationView序列。

因此,这是一个 SwiftUI 设计决策,而不是一个错误。目前,List/Form不是为在保持导航功能的同时识别自定义手势而构建的。如果您有这种行为的用例,请提交一些反馈,也许我们会在明年看到它。

查看层次结构

于 2019-11-04T23:02:02.853 回答
0

谢谢你的解释。这说得通。它让我寻找一种合适的方式来触发我的电话。

.onAppear(){ .... }

我试图在点击导航链接时模拟 viewWillAppear 类型的事件。我将 onAppear 放在 vStack 上,效果很好。

于 2019-11-05T15:39:23.690 回答