当SwiftUI更新窗口的主体时,当前的建议对我失败了。
解决方案:
使用KVO并观察NSApp
在\.mainMenu
上的更改。在SwiftUI完成后,您可以删除任何想要删除的内容。
@objc
class AppDelegate: NSObject, NSApplicationDelegate {
var token: NSKeyValueObservation?
func applicationDidFinishLaunching(_ notification: Notification) {
if let m = NSApp.mainMenu?.item(withTitle: "Edit") {
NSApp.mainMenu?.removeItem(m)
}
["Edit", "View", "Help", "Window"].forEach { name in
NSApp.mainMenu?.item(withTitle: name).map { NSApp.mainMenu?.removeItem($0) }
}
token = NSApp.observe(\.mainMenu, options: .new) { (app, change) in
["Edit", "View", "Help", "Window"].forEach { name in
NSApp.mainMenu?.item(withTitle: name).map { NSApp.mainMenu?.removeItem($0) }
}
guard let menu = app.mainMenu?.item(withTitle: "Edit") else { return }
app.mainMenu?.removeItem(menu)
}
}
}
struct MarblesApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some View {
}
}
思路:
无论是SwiftUI存在漏洞还是他们确实不希望您删除NSApp.mainMenu
中的顶级菜单。目前,SwiftUI似乎重置了整个菜单,并且没有办法覆盖或自定义大多数详细信息(Xcode 13.4.1)。类似于CommandGroup(replacing: .textEditing) { }
这样的命令不允许您删除或清除整个菜单。即使指定没有任何命令,分配新的NSApp.mainMenu
也会在SwiftUI想要时被覆盖。
这似乎是一个非常脆弱的解决方案。应该有一种方法告诉SwiftUI不要触及NSApp.mainMenu
,或者启用更多的自定义功能。否则,SwiftUI应该检查它是否拥有先前的菜单(菜单项为SwiftUI.AppKitMainMenuItem
)。或者我错过了他们提供的一些工具。希望这在WWDC beta中得以解决?
(在针对macOS 12.3并排除Catalyst的情况下,使用Swift 5的Xcode 13.4.1)
CommandGroup(replacing: .saveItem) { }
和CommandGroup(replacing: .newItem) { }
,您可以获得一个空的文件菜单。但是我没有看到完全摆脱它的方法。不幸的是,SwiftUI 在 macOS 上仍然缺乏很多... - ChrisR