我正在尝试使用 SwiftUI 2.0(应用程序结构)中引入的 SwiftUI 应用程序生命周期创建一个菜单栏应用程序,其中 SwiftUI 代码中的按钮和操作将更新状态栏项目的文本。我正在创建一个状态栏项目,它将触发一个包含 SwiftUI 视图的弹出窗口。根据我的理解,最好的方法是将 statusBar 传递给 ContentView 的子级,后者将能够使用 statusBar 作为环境对象。但是,我遇到一个我不明白的问题,即在应用程序委托中工作的代码在 SwiftUI 2.0 init 函数中失败(不清楚原因)。我希望我已将下面所有相关的代码包含在一个单独的示例中,以触及问题的核心。
我有一个工作解决方案,使用NSApplicationDelegateAdaptor
statusBar 在 ContentView 之前初始化,并且 statusBar 只是作为环境对象传递到 ContentView:
import SwiftUI
import AppKit
@main
struct test_status_bar_appApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
Settings{
EmptyView()
}
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
var popover = NSPopover.init()
var statusBar: StatusBarController?
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Create the Status Bar Item with the Popover
statusBar = StatusBarController.init(popover)
// …
Run Code Online (Sandbox Code Playgroud)