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

SwiftUI旋转设备时NavigationLink被销毁问题求助

解决SwiftUI横竖屏切换时导航栈丢失问题

你的问题根源在于:横竖屏切换触发尺寸类变化时,MainScreen的body会重新渲染,原来的NavigationLink在if/else的不同分支中被销毁并重新创建,导致导航栈的状态丢失,从而自动返回主界面。

下面提供两种适用于iOS15的解决方案:

将导航状态抽离为@State变量,让NavigationLink通过isActive绑定控制导航,这样即使布局视图重建,导航状态也会被保留:

struct MainScreen: View {
    @Environment(\.verticalSizeClass) var verticalSizeClass
    @Environment(\.horizontalSizeClass) var horizontalSizeClass
    @State private var isDetailActive = false

    var body: some View {
        NavigationView {
            if horizontalSizeClass == .regular && verticalSizeClass == .compact {
                VStack {
                    // 其他视图..
                    NavigationLink(
                        destination: DetailScreen(),
                        isActive: $isDetailActive,
                        label: { Text("Go to Details Screen") }
                    )
                    // 其他视图..
                }
            } else {
                HStack {
                    // 其他视图..
                    NavigationLink(
                        destination: DetailScreen(),
                        isActive: $isDetailActive,
                        label: { Text("Go to Details Screen") }
                    )
                    // 其他视图..
                }
            }
        }
        .navigationViewStyle(.stack)
    }
}

方案二:使用iOS15+的navigationDestination API

这是Apple推荐的新导航方式,通过按钮触发状态,再用navigationDestination关联目标页面,彻底分离导航触发和视图布局:

struct MainScreen: View {
    @Environment(\.verticalSizeClass) var verticalSizeClass
    @Environment(\.horizontalSizeClass) var horizontalSizeClass
    @State private var showDetail = false

    var body: some View {
        NavigationView {
            Group {
                if horizontalSizeClass == .regular && verticalSizeClass == .compact {
                    VStack {
                        // 其他视图..
                        Button("Go to Details Screen") {
                            showDetail = true
                        }
                        // 其他视图..
                    }
                } else {
                    HStack {
                        // 其他视图..
                        Button("Go to Details Screen") {
                            showDetail = true
                        }
                        // 其他视图..
                    }
                }
            }
            .navigationDestination(isPresented: $showDetail) {
                DetailScreen()
            }
        }
        .navigationViewStyle(.stack)
    }
}

两种方案的核心都是让导航状态独立于布局视图的重建,确保横竖屏切换时导航栈的状态不会丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:15:02