SwiftUI:在macOS上获取侧边栏为折叠状态

gg0vcinb  于 2023-02-03  发布在  Swift
关注(0)|答案(2)|浏览(130)

我正在使用NavigationView在macOS上创建一个侧边栏,可以使用以下代码切换侧边栏:

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

我现在尝试在边栏隐藏时显示标签,在按钮中触发这个操作不会起作用,因为用户也可以通过调整边栏的大小来隐藏边栏。
NSSplitViewItem上有一个isCollapsed属性,我想这是我必须检查的,但是我不知道如何使用SwiftUI访问它。或者有没有其他方法来检查侧边栏的可见性?

vpfxa7rd

vpfxa7rd1#

其思想是找到NSSplitViewController(内部仍用作引擎)并订阅以观察其第一个拆分项(即侧栏)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

bnlyeluc

bnlyeluc2#

在iOS 16+中使用新的NavigationSplitView,这变得容易得多。例如:

@State private var splitViewVisibility = NavigationSplitViewVisibility.all

var body: some View {
    NavigationSplitView(columnVisibility: $splitViewVisibility) {
        SidebarView()
    } detail: {
        DetailVew()
    }
    .onChange(of: splitViewVisibility) { newValue in
        print(newValue)
    }
}

相关问题