为何onTapGesture与NavigationLink无法同时生效?
问题根源是onTapGesture会拦截Label视图的原生点击事件,导致NavigationLink的导航触发逻辑被覆盖。下面提供两种可行的解决方式:
方式一:使用simultaneousGesture替代onTapGesture
simultaneousGesture允许自定义手势和系统原生手势(这里就是NavigationLink的导航触发手势)同时响应,不会互相拦截。修改代码如下:
NavigationView{ VStack{ NavigationLink{ SongListView(audio: Sound.testData) .navigationBarBackButtonHidden(true) .navigationBarTitle("") .navigationBarHidden(true) } label:{ BigCardView(title: "Anxiety relief", audioInfo: "7 audio files", image: "night", horizontalLines: 7, genre:self.genre.genreFilter) .simultaneousGesture(TapGesture().onEnded { self.genre.genreFilter = "anxiety" }) } NavigationLink{ SongListView(audio: Sound.testData) .navigationBarBackButtonHidden(true) .navigationBarTitle("") .navigationBarHidden(true) } label:{ BigCardView(title: "Affirmations", audioInfo: "2 audio files", image: "affir", horizontalLines: 2, genre:self.genre.genreFilter) .simultaneousGesture(TapGesture().onEnded { self.genre.genreFilter = "affirmations" }) } } }
方式二:手动控制NavigationLink的激活状态
通过绑定isActive变量,完全掌控导航的触发时机,先执行自定义逻辑再触发导航:
struct YourParentView: View { @State private var isAnxietyLinkActive = false @State private var isAffirmationsLinkActive = false // 你的genre实例变量 var body: some View { NavigationView{ VStack{ NavigationLink(isActive: $isAnxietyLinkActive) { SongListView(audio: Sound.testData) .navigationBarBackButtonHidden(true) .navigationBarTitle("") .navigationBarHidden(true) } label:{ BigCardView(title: "Anxiety relief", audioInfo: "7 audio files", image: "night", horizontalLines: 7, genre:self.genre.genreFilter) .onTapGesture { self.genre.genreFilter = "anxiety" isAnxietyLinkActive = true } } NavigationLink(isActive: $isAffirmationsLinkActive) { SongListView(audio: Sound.testData) .navigationBarBackButtonHidden(true) .navigationBarTitle("") .navigationBarHidden(true) } label:{ BigCardView(title: "Affirmations", audioInfo: "2 audio files", image: "affir", horizontalLines: 2, genre:self.genre.genreFilter) .onTapGesture { self.genre.genreFilter = "affirmations" isAffirmationsLinkActive = true } } } } } }
两种方式都能解决问题:第一种更简洁,适合只需要同步执行手势和导航的场景;第二种灵活性更高,适合需要在导航前做复杂逻辑判断的场景。
内容的提问来源于stack exchange,提问作者Luka Šalipur
相关产品推荐
相关产品推荐

