You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中NavigationDestination滑动转场失效问题求助

问题原因

你遇到的转场异常是因为每个页面都单独创建了NavigationStack。SwiftUI的NavigationStack是导航容器,当你在Second_View里再嵌套一个NavigationStack时,它会替换掉当前导航栈的上下文,导致从Second_View跳转Third_View时,不是在原有栈上push新页面,而是直接替换当前视图,所以没有滑动转场。

解决方案

只在根视图(First_View)中保留一个NavigationStack,子视图(Second_View、Third_View)移除内部的NavigationStack,直接返回页面内容。核心原则是不要嵌套NavigationStack,以下提供两种实现方式:

方式一:根视图统一管理所有导航目的地

struct First_View: View {
    @State var secondViewShown = false
    @State var thirdViewShown = false
    
    var body: some View {
        NavigationStack {
            VStack {
                Text("Step 1")
                Button(action: { secondViewShown.toggle() }) {
                    Text("Next")
                }
            }
            .navigationDestination(isPresented: $secondViewShown) {
                Second_View(thirdViewShown: $thirdViewShown)
                    .navigationBarHidden(true)
            }
            .navigationDestination(isPresented: $thirdViewShown) {
                Third_View()
                    .navigationBarHidden(true)
            }
        }
    }
}

struct Second_View: View {
    @Binding var thirdViewShown: Bool
    
    var body: some View {
        VStack {
            Text("Step 2")
            Button(action: { thirdViewShown.toggle() }) {
               Text("Next")
            }
        }
    }
}

struct Third_View: View {
    var body: some View {
        VStack {
            Text("Step 3")
        }
    }
}

方式二:子视图内声明自身的导航目的地

如果想让子视图自主管理跳转逻辑,也可以在子视图中添加navigationDestination,但同样不能嵌套NavigationStack:

struct First_View: View {
    @State var secondViewShown = false
    
    var body: some View {
        NavigationStack {
            VStack {
                Text("Step 1")
                Button(action: { secondViewShown.toggle() }) {
                    Text("Next")
                }
            }
            .navigationDestination(isPresented: $secondViewShown) {
                Second_View()
                    .navigationBarHidden(true)
            }
        }
    }
}

struct Second_View: View {
    @State var thirdViewShown = false
    
    var body: some View {
        VStack {
            Text("Step 2")
            Button(action: { thirdViewShown.toggle() }) {
               Text("Next")
            }
        }
        .navigationDestination(isPresented: $thirdViewShown) {
            Third_View()
                .navigationBarHidden(true)
        }
    }
}

struct Third_View: View {
    var body: some View {
        VStack {
            Text("Step 3")
        }
    }
}

两种方式都能保证所有页面处于同一个导航栈中,跳转时会触发正常的右侧滑动转场效果。

内容的提问来源于stack exchange,提问作者aali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:05:02