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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:53:15