Swift中为NavigationLink添加onTapGesture不触发该如何处理?
问题原因
NavigationLink 自身已经内置了用于触发跳转的点击手势,优先级高于你附加在其外层的普通 onTapGesture,因此内置手势会拦截点击事件,导致你自定义的点击事件始终无法触发。
可用解决方案
- 方案1:将手势附加到NavigationLink的内容视图上
把onTapGesture从NavigationLink外层移到它的label内部视图上即可正常触发,示例代码:
struct ExampleView: View { var body: some View { NavigationView() { NavigationLink(destination: Text("Destination")) { Text("Navigate") .onTapGesture { print("Tapped") } } } } }
- 方案2:使用同时手势(simultaneousGesture)
如果需要将手势直接附加在NavigationLink上,可以使用simultaneousGesture让自定义手势和NavigationLink的内置跳转手势同时响应,示例代码:
struct ExampleView: View { var body: some View { NavigationView() { NavigationLink(destination: Text("Destination")) { Text("Navigate") } .simultaneousGesture(TapGesture().onEnded { print("Tapped") }) } } }
- 方案3:通过isActive绑定监听跳转状态
如果你的逻辑需要和跳转状态强绑定(比如跳转前做数据校验、跳转后做埋点上报),可以使用带isActive参数的NavigationLink,监听状态变化触发函数,示例代码:
struct ExampleView: View { @State private var isNavActive = false var body: some View { NavigationView() { NavigationLink(isActive: $isNavActive, destination: { Text("Destination") }, label: { Text("Navigate") }) .onChange(of: isNavActive) { newValue in if newValue { print("导航即将触发") } } } } }
内容的提问来源于stack exchange,提问作者John Sorensen
相关产品推荐
相关产品推荐

