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. 是否必须手动添加工具栏项?
不需要。只要满足两个条件:
- 将侧边栏对应的
NSSplitViewItem的behavior设为.sidebar - 给
splitView设置autosaveName
系统就会自动在工具栏中添加符合macOS规范的侧边栏切换按钮,样式、交互逻辑完全和Finder、Mail等系统应用一致,无需手动创建按钮。
内容的提问来源于stack exchange,提问作者IRP_HANDLER
相关产品推荐
相关产品推荐

