🦋
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