SwiftUI:响应 macOS 上的应用程序终止

Posted

技术标签:

【中文标题】SwiftUI:响应 macOS 上的应用程序终止【英文标题】:SwiftUI: respond to app termination on 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: 的等价物?

【问题讨论】:

【参考方案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 传递我的模型对象,以便我可以通过应用委托访问其属性? 一个问题 - 一个答案,这是不同的问题......你可以在***.com/a/63597866/12299030找到答案。

以上是关于SwiftUI:响应 macOS 上的应用程序终止的主要内容,如果未能解决你的问题,请参考以下文章

macOS 上的 SwiftUI:如何为 onDelete 启用 UI(从列表中删除)

SwiftUI:更改 macOS 上的默认命令菜单

在 MacOS 上的 SwiftUI 中查找点击位置

macOS 应用程序上的 12000 个条目的 FetchRequest 非常慢,但 iOS 应用程序却没有 - 尽管代码相同(macOS Big Sur / iOS 14 上的 SwiftUI)

macOS 上的 SwiftUI:带有详细视图和多选的列表

SwiftUI:如何从 macOS 上的联系人中拖放联系人