SwiftUI中关闭Sheet时导航视图意外返回的问题求助
问题根源
你当前的实现存在两个关键问题:
- 使用
AnyView包装跳转目标视图,SwiftUI无法正确跟踪视图身份与状态,Sheet关闭触发视图更新时,navigateTo的AnyView实例会被重建,间接导致isActive状态重置,触发返回。 - 将
NavigationLink放在NavigationView外部的background中,脱离了导航栈的管理上下文,容易引发状态同步异常。
修复方案
方案一:移除AnyView,直接使用具体视图类型(适合单目标跳转)
把NavigationLink移到NavigationView内部,去掉AnyView的包装,让SwiftUI能正常管理导航状态:
struct FeedView: View { @State var isActive = false var body: some View { NavigationView { VStack { Menu { Button { isActive = true } label: { Label("Give us feedback", systemImage: "arrowshape.zigzag.right") } } label: { Text("example for stack overflow") } // 隐藏的NavigationLink放在NavigationView内部 NavigationLink(destination: FeedbackView(), isActive: $isActive) { EmptyView() } .hidden() } } } }
方案二:使用Tag+Selection的NavigationLink(适合多目标跳转场景)
如果需要跳转到多个不同视图,用枚举定义跳转目标,通过selection绑定管理导航,彻底避免AnyView的问题:
// 定义跳转目标枚举 enum NavTarget { case feedback // 可添加其他跳转目标,比如case settings } struct FeedView: View { @State var selectedTarget: NavTarget? var body: some View { NavigationView { Menu { Button { selectedTarget = .feedback } label: { Label("Give us feedback", systemImage: "arrowshape.zigzag.right") } } label: { Text("example for stack overflow") } .background( NavigationLink(tag: NavTarget.feedback, selection: $selectedTarget) { FeedbackView() } label: { EmptyView() } ) } } }
验证效果
修改后,滑动关闭Sheet时,FeedbackView会保持在导航栈中,不会意外返回FeedView。
内容的提问来源于stack exchange,提问作者MichaelJ
相关产品推荐
相关产品推荐

