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

SwiftUI NavigationSplitView:调整内容列宽度无法正常工作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:13:15