You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:39:24