如何在按钮上显示设置视图单击macOS SwiftUI



我有这个应用程序,它是一个菜单栏应用程序,因此该应用程序从未真正"聚焦",因此用户不能立即使用CMD + ,快捷方式打开应用程序的设置,因此我想添加一个按钮选项,以便他们也可以通过菜单栏打开设置:

@main
struct macOSApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var delegate

var body: some Scene {
WindowGroup {
MenuView()
.environmentObject(Authentication())
}
WindowGroup("LoginView") {
LoginView()
.environmentObject(Authentication())
}.handlesExternalEvents(matching: Set(arrayLiteral: "macOSApp://LoginView"))
Settings {
SettingsView()
.environmentObject(Authentication())
}.handlesExternalEvents(matching: Set(arrayLiteral: "macOSApp://SettingsView"))
}
}

我有:

Settings {
SettingsView()
.environmentObject(Authentication())
}.handlesExternalEvents(matching: Set(arrayLiteral: "macOSApp://SettingsView"))
}

对于我的设置页面,如果用户通过CMD + ,快捷方式打开它,它会非常有效,我在上面添加了一个.handlesExternalEvents(matching: Set(arrayLiteral: "macOSApp://SettingsView"))修饰符,这样点击按钮就可以运行:

if let url = URL(string: "UpSend://SettingsView") {
openURL(url)
}

这适用于我的登录屏幕,但当它运行时,它只是获取应用程序的主视图,并将其放在自己的窗口中,而不显示Settings屏幕。

我很感激我没有使用WindowGroup,我使用的是Settings,所以打开窗口可能需要完全不同的东西,我只是不知道是什么?

对于macOS 13.0

if #available(macOS 13.0, *) {
NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil)
}
else {
NSApp.sendAction(Selector(("showPreferencesWindow:")), to: nil, from: nil)
}

不要在handlesExternalEvents中包含"macOSApp://"部分。试试这个:

Settings {
SettingsView()
.environmentObject(Authentication())
}.handlesExternalEvents(matching: Set(arrayLiteral: "SettingsView"))
}
NSApp.sendAction(Selector(("showPreferencesWindow:")), to: nil, from: nil)

最新更新