🦋

SwiftUI: macOSでウインドウが閉じたことを検出する

2023/01/01に公開

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.frameAutosaveNameWindowidが入るようなので、それで処理すべきウインドウが閉じたのかどうかが判断できる。ちなみに、SettingsframeAutosaveNamecom_apple_SwiftUI_Settings_windowで固定の模様。

Discussion