禁用折叠侧边栏/NavigationSplitView

问题描述 投票:0回答:1

如何在 macOS 中禁用侧边栏最小化?在 App Store、音乐、提醒、邮件、消息等应用程序中,此功能被禁用。在像反馈助手这样的应用程序中,存在一个严重错误 - 最小化后,除非清除 ~/Library/Containers/Feedback Assistant,否则无法打开侧边栏。

同时,如果使用NavigationView,将不会有关闭/打开侧边栏的按钮,而菜单本身可以最小化。为什么侧边栏叫导航*视图?

我见过其他线程,这是通过使用 swiftui-introspect 添加额外的依赖项来完成的,但我对此方法不满意,因为它是一个依赖项。 SwiftUI 是否如此不完整以至于没有处理 UI 元素的常用功能?为什么需要创建如此大量的抽象 AppKit、UIKit、SwiftUI?


看来Apple主要是美观的完整性,而功能的完整性根本没有,或者你需要理解嵌套的概念,然后你才会意识到如何使用一些Framework功能,而文档却根本没有反映。整个声明式风格闻起来像废话,因为 WWDC 上的示例甚至有一半都不能正常工作,而且文档是“通过屁股”编写的。 #苹果
macos swiftui navigationview navigationsplitview
1个回答
0
投票

要防止侧边栏被切换,您可以隐藏切换按钮:

.toolbar(removing: .sidebarToggle)

不幸的是,隐藏切换开关并不能阻止侧边栏通过将其边缘拖动到一侧来关闭。正如您所指出的,一旦侧边栏被隐藏,就很难将其恢复。即使应用程序重新启动,它似乎也会记住侧边栏被隐藏并使其隐藏。

我找不到防止侧边栏被拖动隐藏的方法。但是,您可以做的是将列可见性与

NavigationSplitViewVisibility
绑定相关联。然后,您可以使用
onChange
处理程序来检测侧边栏是否已隐藏并强制其再次重新打开。我发现这需要异步执行并短暂等待(1 秒似乎就足够了)。

@State private var columnVisibility = NavigationSplitViewVisibility.automatic

var body: some View {
    NavigationSplitView(columnVisibility: $columnVisibility) {
        Text("sidebar")
            .toolbar(removing: .sidebarToggle)
    } detail: {
        Text("detail")
    }
    .onChange(of: columnVisibility, initial: true) { oldVal, newVal in
        if newVal == .detailOnly {
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                columnVisibility = .doubleColumn
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.