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 !!
我正在使用 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 !!