SwiftUI - 如何禁用侧边栏折叠?

Sha*_*niq 9 macos swift swiftui

gif图更容易理解

有没有办法禁用 SidebarListStyle NavigationViews 的可折叠性?

Osk*_*kar 4

编辑:此方法截至 2022 年末仍然有效,并且从未停止在任何版本的 macOS 上工作(直到最新的 Ventura 13.1)。不知道为什么这里有答案提出其他建议。如果 Introspection 库更改了其 API,您可能需要相应地更新您的调用,但解决方案的要点是相同的。


使用此 SwiftUI Introspection 库: https://github.com/siteline/SwiftUI-Introspect

我们可以通过扩展它们的功能来反思底层NSSplitView

public func introspectSplitView(customize: @escaping (NSSplitView) -> ()) -> some View {
    return introspect(selector: TargetViewSelector.ancestorOrSibling, customize: customize)
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个通用扩展View

public extension View {
    func preventSidebarCollapse() -> some View {
        return introspectSplitView { splitView in
            (splitView.delegate as? NSSplitViewController)?.splitViewItems.first?.canCollapse = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以在我们的侧边栏上使用:

var body: some View {
    (...)
    MySidebar()
        .preventSidebarCollapse()
}
Run Code Online (Sandbox Code Playgroud)