iPad端NavigationSplitView侧边栏状态持久化控制问题求助
问题根源
你的代码逻辑本身没有问题,但在iOS 18及更早版本中,NavigationSplitView存在系统级bug:绑定的columnVisibility在设备旋转时无法正确保留状态,导致侧边栏可见性被强制重置。而**iOS 26+**官方已修复此问题,你的原始代码在该版本下可正常工作。
兼容旧版本的临时修复方案
方案1:用@AppStorage持久化状态
将状态存储到UserDefaults,避免视图重建时丢失:
import SwiftUI @main struct TestApp: App { @AppStorage("splitViewVisibility") private var visibilityRaw = "all" private var columnVisibility: Binding<NavigationSplitViewVisibility> { Binding( get: { switch visibilityRaw { case "all": return .all case "detailOnly": return .detailOnly default: return .all } }, set: { switch $0 { case .all: visibilityRaw = "all" case .detailOnly: visibilityRaw = "detailOnly" default: visibilityRaw = "all" } } ) } var body: some Scene { WindowGroup { NavigationSplitView(columnVisibility: columnVisibility) { Color.green } detail: { LinearGradient(colors: [.red, .yellow], startPoint: .leading, endPoint: .trailing) } .navigationSplitViewStyle(.balanced) } } }
方案2:用ObservableObject管理全局状态
创建独立的状态管理器,脱离视图生命周期:
import SwiftUI class SplitViewState: ObservableObject { @Published var columnVisibility: NavigationSplitViewVisibility = .all } @main struct TestApp: App { @StateObject private var splitState = SplitViewState() var body: some Scene { WindowGroup { NavigationSplitView(columnVisibility: $splitState.columnVisibility) { Color.green } detail: { LinearGradient(colors: [.red, .yellow], startPoint: .leading, endPoint: .trailing) } .navigationSplitViewStyle(.balanced) } } }
补充:添加手动切换按钮
要让用户能通过默认按钮控制侧边栏,需在侧边栏视图中添加工具栏按钮:
// 替换侧边栏的Color.green为以下内容 NavigationStack { Color.green .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button { splitState.columnVisibility = splitState.columnVisibility == .all ? .detailOnly : .all } label: { Image(systemName: "sidebar.left") } } } }
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

