SwiftUI NavigationSplitView:调整内容列宽度无法正常工作
嘿,我看了你遇到的这个NavigationSplitView内容列宽度调整的问题,咱们先梳理下问题,再一步步解决它~
首先看你贴的代码片段,里面有个明显的拼写错误:$visibi应该是$visibility,这会导致列可见性的绑定失效,肯定没法正常控制宽度变化。另外,你额外维护的isSidebarVisible状态其实没必要,因为NavigationSplitViewVisibility本身就能直接判断sidebar是否可见,重复维护状态反而容易出现状态不一致的问题。
我给你调整后的完整代码,你可以直接测试:
import SwiftUI struct ContentView: View { // 用这个状态直接控制列的可见性,无需额外的isSidebarVisible @State private var visibility: NavigationSplitViewVisibility = .all var body: some View { NavigationSplitView(columnVisibility: $visibility) { // Sidebar 示例内容 List(1...10, id: \.self) { item in Text("Sidebar Item \(item)") } .navigationTitle("Sidebar") } content: { // 根据sidebar是否可见动态切换宽度 List(1...10, id: \.self) { item in Text("Content Item \(item)") } .navigationTitle("Content") .frame(width: visibility != .detailOnly ? 200 : 600) } detail: { Text("Detail View") .navigationTitle("Detail") } // 加个按钮手动切换sidebar状态,方便测试宽度变化 .toolbar { Button("Toggle Sidebar") { visibility = visibility == .all ? .detailOnly : .all } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
这里的关键逻辑是:
- 直接通过
visibility != .detailOnly判断sidebar是否可见(.all和.sidebarOnly都代表sidebar显示,只有.detailOnly是仅显示详情列) - 在content列的
frame(width:)里动态传入200或600,实现宽度随sidebar状态自动切换 - 去掉了多余的
isSidebarVisible,避免状态不同步的问题
你可以运行这段代码,点击工具栏的“Toggle Sidebar”按钮,就能看到content列的宽度在200和600之间正常切换了~
备注:内容来源于stack exchange,提问作者helloworld142857
相关产品推荐
相关产品推荐

