SwiftUI:macOSでアプリの終了に応答する
Nov 21 2020
SwiftUI2.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 Asperi Nov 21 2020 at 07:42
アダプタを介してアプリケーションデリゲートを挿入できます。次の例として使用します。
#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
}