🦋
SwiftUI: macOSでウインドウが閉じたことを検出する
WindowGroupの場合
.onDisappear()を使えば良い。ViewModelなどのマルチウインドウ対応がしっかりできている時はこちらでよさそう。
import SwiftUI
@main
struct SampleApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onDisappear {
// ウインドウが閉じた時の処理
}
}
}
}
Windowの場合
シングルウインドウにどうしてもしたいときはWindowGroupではなくWindowを使うことになるが、ウインドウを閉じたときに.onDisappear()は発火しないため、他の手段が必要。
NSWindow.willCloseNotificationを監視する。
import SwiftUI
@main
struct SampleApp: App {
var body: some Scene {
Window("SampleApp", id: "main-content") {
ContentView()
.onReceive(NotificationCenter.default.publisher(for: NSWindow.willCloseNotification)) { notification in
if let window = notification.object as? NSWindow {
if window.frameAutosaveName == "main-content" {
// ウインドウが閉じた時の処理
}
}
}
}
}
}
NSWindow.frameAutosaveNameにWindowのidが入るようなので、それで処理すべきウインドウが閉じたのかどうかが判断できる。ちなみに、SettingsのframeAutosaveNameはcom_apple_SwiftUI_Settings_windowで固定の模様。
Discussion