作者:手机用户2502859667 | 来源:互联网 | 2023-07-06 11:22
我在用 SwiftUI 创建的 MacOS 上创建了一个非常简单的应用程序。默认有一个菜单项show tab bar
。我如何删除它?我在这个应用程序中有标签没有意义。
我发现以下回答了相同的问题,但对于旧版本的 Swift,而不是 SwiftUI:如何禁用 Sierra 应用程序中的“显示标签栏”菜单选项?
回答
SwiftUI 中的等价物与 Swift 中的等价物相同(由于某种原因,在那篇文章中遗漏了)。要从应用程序的任何窗口中完全删除这些项目,在您的应用程序委托中,您可以将布尔值allowedAutomaticWindowTabbing设置为 false
func applicationWillFinishLaunching(_ notification: Notification) {
NSWindow.allowsAutomaticWindowTabbing = false
}
回答
我也在为此寻找答案并发现以下内容:
默认情况下 - 正如您已经提到的 - 显示/隐藏选项卡处于活动状态:
有一个属性NSWindow
叫做tabbingMode
它允许我们将其设置为采取控制.disallowed
。我的问题是:在 SwiftUI 2-lifecycle 应用程序中,我怎样才能获得应用程序的窗口?
嗯,有NSApplication.shared.windows
,所以我的第一个(不工作!!)尝试是修改我的@main
-App 结构中的所有窗口(因为我已经阻止了新窗口的创建,这应该就足够了):
import SwiftUI
@main
struct DQ_SyslogApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onAppear {
let _ = NSApplication.shared.windows.map { $0.tabbingMode = .disallowed }
}
}
.commands {
CommandGroup(replacing: .newItem) {} //remove "New Item"-menu entry
}
}
}
不幸的是这并没有因为工作NSApplication.shared.windows
是空的.onAppear
。
我的下一步涉及在我的 SwiftUI 2 生命周期中引入一个 AppDelegate 来实现applicationDidFinishLaunching(_:)
......
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
print("Info from `applicationDidFinishLaunching(_:): Finished launching…")
let _ = NSApplication.shared.windows.map { $0.tabbingMode = .disallowed }
}
}
...并将此 AppDelegate 引入应用程序:
import SwiftUI
@main
struct DQ_SyslogApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
.commands {
CommandGroup(replacing: .newItem) {} //remove "New Item"-menu entry
}
}
}
这对我有用:
虽然我希望完全删除菜单项,但这至少可以防止用户拥有 OP 要求的选项卡。
如果有人碰巧知道隐藏这些条目的解决方案,请告诉我们。我找不到CommandGroupPlacement
代表这些菜单的...