iOS SwiftUI中使用NavigationLink时执行额外操作的问题
当你给NavigationLink的label视图添加onTapGesture时,这个手势会拦截NavigationLink默认的导航跳转事件,导致仅执行手势内的代码,页面无法正常跳转。下面提供几种可行的解决方式:
方法一:通过绑定isActive手动控制跳转
先定义一个状态变量来控制导航链接的激活状态:
@State private var isPrivacyLinkActive = false
然后修改NavigationLink的实现,在手势中主动激活跳转:
NavigationLink( destination: ShowWebView(showWhat: "privacy"), isActive: $isPrivacyLinkActive, label: { HStack(spacing: 32) { Image(systemName: "info.square") .font(.title2) .frame(width: 26) Text("privacy_policy") } .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) .onTapGesture { withAnimation { self.offsetMenu = UIScreen.main.bounds.height } // 手动激活导航跳转 isPrivacyLinkActive = true } } )
方法二:将onTapGesture添加到NavigationLink本身
把手势绑定在NavigationLink外层,而不是内部的label视图上,这样手势和导航的默认点击事件会同时触发:
NavigationLink( destination: ShowWebView(showWhat: "privacy"), label: { HStack(spacing: 32) { Image(systemName: "info.square") .font(.title2) .frame(width: 26) Text("privacy_policy") } .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) } ) .onTapGesture { withAnimation { self.offsetMenu = UIScreen.main.bounds.height } }
方法三:使用simultaneousGesture让手势与默认事件共存
通过simultaneousGesture让自定义手势和NavigationLink的默认点击事件同时响应,避免手势拦截:
NavigationLink( destination: ShowWebView(showWhat: "privacy"), label: { HStack(spacing: 32) { Image(systemName: "info.square") .font(.title2) .frame(width: 26) Text("privacy_policy") } .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) .simultaneousGesture( TapGesture().onEnded { withAnimation { self.offsetMenu = UIScreen.main.bounds.height } } ) } )
内容的提问来源于stack exchange,提问作者user19559647
相关产品推荐
相关产品推荐

