iOS 15下@Binding控制NavigationLink返回失效问题排查
问题根源
你当前的绑定逻辑只控制了SecondView到ThirdView的NavigationLink激活状态,但在FourthView中把shouldGoToSecond设为false时,仅会尝试弹出ThirdView,而FourthView仍留在导航栈中,所以无法直接回到SecondView。另外iOS15的NavigationView里,NavigationLink的isActive绑定仅对直接对应的目标视图生效,无法跨层级一次性弹出多个视图。
解决方案
方案一:用presentationMode手动弹出两次
从FourthView回到SecondView需要连续弹出两个视图(Fourth→Third→Second),可以借助@Environment(\.presentationMode)实现异步两次dismiss:
struct ForthView: View { @Environment(\.presentationMode) var presentationMode var body: some View { VStack { Text("Hello, World") Button { // 先弹出当前的FourthView presentationMode.wrappedValue.dismiss() // 异步弹出ThirdView,确保第一次dismiss完成后执行 DispatchQueue.main.async { presentationMode.wrappedValue.dismiss() } } label: { Text("Go to Second") } } } }
方案二:通过绑定控制各层级导航状态
给FourthView添加对ThirdView导航状态的绑定,依次关闭各层级的NavigationLink:
- 修改ThirdView,将自身的导航状态绑定传递给FourthView:
struct ThirdView: View { @Binding var shouldGoToSecond: Bool @State private var isActive: Bool = false var body: some View { VStack { Text("Hello, World!") NavigationLink(destination: ForthView(shouldGoToSecond: $shouldGoToSecond, shouldGoToThird: $isActive), isActive: $isActive) { Button { isActive = true } label: { Text("Go to Forth") } } } .navigationTitle("Third") } }
- 修改FourthView,接收两个绑定并依次关闭:
struct ForthView: View { @Binding var shouldGoToSecond: Bool @Binding var shouldGoToThird: Bool var body: some View { VStack { Text("Hello, World") Button { // 先关闭FourthView对应的导航链接 shouldGoToThird = false // 再关闭ThirdView对应的导航链接 shouldGoToSecond = false } label: { Text("Go to Second") } } } }
额外注意
确保你的根视图(比如FirstView)被包裹在NavigationView中,否则导航功能无法正常工作:
@main struct YourApp: App { var body: some Scene { WindowGroup { NavigationView { FirstView() } } } }
内容的提问来源于stack exchange,提问作者Mrugesh Tank
相关产品推荐
相关产品推荐

