SwiftUI旋转设备时NavigationLink被销毁问题求助
解决SwiftUI横竖屏切换时导航栈丢失问题
你的问题根源在于:横竖屏切换触发尺寸类变化时,MainScreen的body会重新渲染,原来的NavigationLink在if/else的不同分支中被销毁并重新创建,导致导航栈的状态丢失,从而自动返回主界面。
下面提供两种适用于iOS15的解决方案:
方案一:使用带绑定状态的NavigationLink
将导航状态抽离为@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
相关产品推荐
相关产品推荐

