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

SwiftUI的NavigationSplitView与NavigationLink在AppKit中的等效实现

纯AppKit实现带侧边栏的分栏视图方案

1. 你的手动实现是否正确?

手动添加工具栏项控制侧边栏折叠本身可行,但样式不符是因为没遵循macOS原生按钮规范。正确的做法是利用NSSplitViewController内置的切换方法,同时给按钮设置系统指定的样式:

// 创建工具栏项
let sidebarToggleItem = NSToolbarItem(itemIdentifier: .sidebarTrackingSeparator)
// 创建符合系统样式的按钮
let sidebarButton = NSButton(
    image: NSImage(systemSymbolName: "sidebar.left", accessibilityDescription: "Toggle Sidebar")!,
    target: splitViewController,
    action: #selector(NSSplitViewController.toggleSidebar(_:))
)
sidebarButton.bezelStyle = .texturedRounded
sidebarButton.setButtonType(.toggle)
sidebarToggleItem.view = sidebarButton
// 添加到工具栏
toolbar.items.append(sidebarToggleItem)

绑定toggleSidebar(_:)这个内置方法,既不用自己写折叠逻辑,也能保证按钮交互和系统应用一致。

2. 其他实现侧边栏的方式

除了手动配置,还有两种更贴合系统规范的方案:

  • Storyboard可视化配置:拖入NSSplitViewController后,将左侧分栏的NSSplitViewItem的behavior设为.sidebar,系统会自动在工具栏添加侧边栏切换按钮,无需手动编写任何工具栏相关代码。
  • 纯代码自动绑定系统工具栏项:给分栏项设置.sidebar行为,同时给splitView指定自动保存名称,系统会自动注入规范的切换按钮:
// 配置侧边栏分栏项
let sidebarItem = NSSplitViewItem(viewController: SidebarViewController())
sidebarItem.behavior = .sidebar
// 配置内容分栏项
let contentItem = NSSplitViewItem(viewController: ContentViewController())
// 添加到分栏控制器
splitViewController.addSplitViewItem(contentItem)
splitViewController.insertSplitViewItem(sidebarItem, at: 0)
// 设置自动保存名称,触发系统自动添加工具栏按钮
splitViewController.splitView.autosaveName = "MainSplitView"

// 初始化窗口工具栏
window.toolbar = NSToolbar(identifier: "MainToolbar")
window.toolbar?.allowsUserCustomization = true
window.toolbar?.autosavesConfiguration = true

3. 是否必须手动添加工具栏项?

不需要。只要满足两个条件:

  1. 将侧边栏对应的NSSplitViewItem的behavior设为.sidebar
  2. 给splitView设置autosaveName
    系统就会自动在工具栏中添加符合macOS规范的侧边栏切换按钮,样式、交互逻辑完全和Finder、Mail等系统应用一致,无需手动创建按钮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:06