macOS中NavigationSplitViewVisibility.detailOnly失效问题求助
你遇到的问题主要来自两个原因:
- 状态显示不实时:代码里的
cvString是存储属性,初始化时就固定为初始的.all,不会随columnVisibility的变化同步更新,导致你看不到真实的状态切换结果。 - 系统自动恢复列配置:macOS上的
NavigationSplitView默认会自动存储并恢复列的可见性状态,这会覆盖你手动设置的.detailOnly。
修正后的代码
import SwiftUI struct ContentView: View { @State private var columnVisibility: NavigationSplitViewVisibility = .all // 改为计算属性,实时反映当前状态 private var cvString: String { "\(columnVisibility)" } var body: some View { NavigationSplitView(columnVisibility: $columnVisibility) { VStack { Text("Sidebar") .frame(maxWidth: .infinity, maxHeight: .infinity) } .background(.red) } content: { VStack { Text("Content") .frame(maxWidth: .infinity, maxHeight: .infinity) } .background(.orange) } detail: { VStack { Spacer() Text("Detail") .frame(maxWidth: .infinity, maxHeight: .infinity) HStack { Text("Current Visibility:") .bold() Text("\(cvString)") .fontDesign(.monospaced) } Button("Next Visibility") { self.columnVisibility = columnVisibility.next() } Spacer() } .background(.green) } // 禁用系统自动恢复列状态的行为 .navigationSplitViewStorageBehavior(.never) } } extension NavigationSplitViewVisibility { func next() -> NavigationSplitViewVisibility { switch self { case .all: print("All -> DetailOnly"); return .detailOnly case .detailOnly: print("DetailOnly -> DoubleColumn"); return .doubleColumn case .doubleColumn: print("DoubleColumn -> All"); return .all default: print("Not handled.") return self } } }
额外说明
- 如果窗口尺寸过大,系统可能仍会强制显示多列,可以尝试缩小窗口测试
.detailOnly的效果。 navigationSplitViewStorageBehavior(.never)会阻止系统记住列的状态,确保你的手动配置能生效。
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

