SwiftUI:在 macOS 上获取侧边栏 isCollapsed 状态

SwiftUI: Get sidebar isCollapsed state on macOS

我正在使用 NavigationView 在 macOS 上创建侧边栏。我可以使用此代码切换侧边栏:

Button {
    NSApp.keyWindow?.firstResponder?.tryToPerform(
    #selector(NSSplitViewController.toggleSidebar(_:)), with: nil)
}

我现在正在尝试在边栏隐藏时显示标签。在按钮中触发此操作将不起作用,因为用户还可以通过调整它的大小来隐藏侧边栏。

NSSplitViewItem 上有一个 isCollapsed 属性,我想这是我可能需要检查的内容,但我不知道如何使用 SwiftUI 访问它。或者有其他方法来检查侧边栏可见性吗?

思路是找到NSSplitViewController(内部仍然作为引擎使用)并订阅观察它的第一个split item(也就是我们的sidebar)isCollapsed状态。

测试 Xcode 13.3 / macOS 12.2.1

这是主要部分:

  // find split view through hierarchy
  while sview != nil, !sview!.isKind(of: NSSplitView.self) { 
    sview = sview?.superview
  }
  guard let sview = sview as? NSSplitView else { return }
  
  controller = sview.delegate as? NSSplitViewController   // delegate is our controller
  if let sideBar = controller?.splitViewItems.first {     // now observe for state
    observer = sideBar.observe(\.isCollapsed, options: [.new]) { [weak self] _, change in
      if let value = change.newValue {
        self?.sideCollapsed?.wrappedValue = value    // << here !!
      }
    }
  }

和用法类似

SideViewInsideNavigationView()
  .background(SplitViewAccessor(sideCollapsed: $collapsed))   // << inject finder !!

完成findings and code is here