macOS SwiftUI中如何检测用户关闭Window场景窗口?
在macOS SwiftUI中检测窗口关闭的解决方案
核心问题分析
你之前使用视图的onDisappear无法触发,是因为视图的onDisappear仅在视图被从父视图层级中移除时触发,而关闭窗口是整个Window场景被销毁,并不会触发视图的这个生命周期方法。
问题1:如何检测用户关闭窗口?
有两种简单可靠的方式:
方式1:给Window场景添加onDisappear(推荐)
直接将onDisappear修饰符添加到Window场景上,窗口关闭时这个回调会被触发:
@main struct DemoApp: App { var body: some Scene { WindowGroup { ContentView() } Window("test", id: "test") { Color.red } .onDisappear { print("窗口已关闭") f1() } } func f1() { print("f1 called") } }
方式2:监听NSWindow关闭通知
如果需要在视图内部处理,可以通过通知中心监听NSWindow.willCloseNotification,还可以额外判断目标窗口:
Window("test", id: "test") { Color.red .onReceive(NotificationCenter.default.publisher(for: NSWindow.willCloseNotification)) { notification in // 验证是否是目标窗口(可选) if let window = notification.object as? NSWindow, window.identifier?.rawValue == "test" { f1() } } }
问题2:你遗漏的配置
你把onDisappear加在了Color.red视图上,而不是Window场景本身。视图的生命周期和窗口的生命周期是分离的,关闭窗口不会触发视图的onDisappear,必须将监听逻辑移到Window场景层级才能生效。
内容的提问来源于stack exchange,提问作者user1046037
相关产品推荐
相关产品推荐

