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

SwiftUI(macOS Big Sur):如何将ToolbarItem对应到右侧视图

解决macOS SwiftUI三列布局中各视图的专属ToolbarItem问题

这个问题在Xcode 12 Beta + macOS Big Sur Beta的SwiftUI三列布局里确实挺典型的——默认情况下,外层NavigationView会把所有子视图的Toolbar合并到同一区域,导致右侧视图的ToolbarItem跑到左边去。要实现每个列视图拥有独立的工具栏,核心思路是给每个列的内容嵌套独立的NavigationView,并绑定对应的导航标题。

修改后的完整代码

import SwiftUI

struct ContentView: View {
    enum NavigationItem {
        case demo
    }
    @State private var selection: Set<NavigationItem> = [.demo]
    
    var body: some View {
        NavigationView {
            // 侧边栏部分保持不变
            List(selection: $selection) {
                Label("Demo", systemImage: "list.bullet")
            }
            .listStyle(SidebarListStyle())
            .frame(minWidth: 200, idealWidth: 250, maxWidth: 300, maxHeight: .infinity)
            
            // 左侧列:嵌套独立NavigationView以绑定专属工具栏
            NavigationView {
                Text("Left")
                    .frame(maxWidth: 500, maxHeight: .infinity)
                    .navigationTitle("Left View") // 关键:必须设置导航标题来关联工具栏
                    .toolbar {
                        ToolbarItem {
                            Button(action: {}) {
                                Text("Left Toolbar")
                            }
                        }
                    }
                    .presentedWindowToolbarStyle(ExpandedWindowToolbarStyle())
            }
            
            // 右侧列:同样嵌套独立NavigationView
            NavigationView {
                Text("Right")
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .navigationTitle("Right View")
                    .toolbar {
                        ToolbarItem {
                            Button(action: {}) {
                                Text("Right Toolbar")
                            }
                        }
                    }
            }
        }
    }
}

关键说明

  • 嵌套独立NavigationView:每个列的内容都被包裹在自己的NavigationView中,这样每个视图会拥有独立的导航上下文,工具栏会自动绑定到对应的列,不会再出现合并的情况。
  • 必须设置navigationTitle:这是SwiftUI识别视图需要独立工具栏的必要条件——如果省略导航标题,工具栏依然会合并到外层的NavigationView中。
  • 隐藏导航标题的小技巧:如果不需要显示实际的导航标题,可以设置空字符串代替,工具栏依然能正常工作:
    .navigationTitle("")
    

这个方案在你使用的Xcode 12 Beta和Big Sur Beta环境下可以稳定生效,完美实现三列布局中每个视图的专属ToolbarItem需求。

内容的提问来源于stack exchange,提问作者Felix Marianayagam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:17:30