这是一种新方法:
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
RootScreen()
}
Settings {
SettingsScreen()
}
MenuBarExtra("My App", systemImage: "mic.fill") {
SettingsLink {
Text("Settings")
}
}
.keyboardShortcut(".", modifiers: .command)
}
Alternative if you have NSMenu
https://github.com/orchetect/SettingsAccess个
import SettingsAccess
private func setupStatusBar() {
let menu = NSMenu()
menu.addItem(NSMenuItem(title: "Settings", action: #selector(openSettings), keyEquivalent: ""))
statusBarItem = NSStatusBar.system.statusItem(withLength: CGFloat(NSStatusItem.variableLength))
statusBarItem!.menu = menu
statusBarItem!.button?.image = NSImage(systemSymbolName: "mic.fill", accessibilityDescription: nil)
}
@objc private func openSettings() {
if #available(macOS 14, *) {
appState?.openSettingsSignal.send()
}
}
---
import SettingsAccess
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
RootScreen()
.openSettingsAccess()
}
}
}
---
struct RootScreen: View {
private let appState: AppState
@Environment(\.openSettings) var openSettings
var body: some View {
}
.onReceive(appState.openSettingsSignal) {
try? openSettings()
}
}
---
struct AppState {
let openSettingsSignal = PassthroughSubject<Void, Never>()
}