【问题标题】:SwiftUI: respond to app termination on macOSSwiftUI:响应 macOS 上的应用程序终止
【发布时间】:2020-11-21 06:20:50
【问题描述】:

我正在使用 SwiftUI 2.0 创建一个跨平台应用程序。应用程序的生命周期由 SwiftUI 管理,因此没有应用程序或场景委托。如果可能的话,我想保持这种状态。为了在应用退出或进入后台时保留数据,我正在关注scenePhase的变化。

@main
struct MyApp: App {
    
    @Environment(\.scenePhase) var scenePhase
    @StateObject var dataModel = DataModel()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onChange(of: scenePhase) { newScenePhase in
                    switch newScenePhase {
                    case .background, .inactive:
                        dataModel.save()
                    default: break
                }
        }
    }
}

但是,这种方法有一个固有的缺陷:在 macOS 上,当应用程序终止时,scenePhase 没有变化,因此数据不会持久化。是否有单独的机制来检测应用程序终止? SwiftUI 是否有 applicationWillTerminate: 的等价物?

【问题讨论】:

    标签: macos swiftui


    【解决方案1】:

    您可以通过适配器注入应用程序委托。使用如下示例:

    #if os(macOS)
    class AppDelegate: NSObject, NSApplicationDelegate {
    
        func applicationWillTerminate(_ aNotification: Notification) {
            // Insert code here to tear down your application
        }
    }
    #endif
    
    @main
    struct MyApp: App {
    
    #if os(macOS)
        @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    #endif
    
        // ... other code
    }
    

    【讨论】:

    • 如何通过@ NSApplicationDelegateAdaptor 传递我的模型对象,以便我可以通过应用委托访问其属性?
    • 一个问题 - 一个答案,这是不同的问题......你可以在stackoverflow.com/a/63597866/12299030找到答案。
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 2021-07-26
    • 2015-11-10
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2011-04-17
    • 2015-04-21
    相关资源
    最近更新 更多