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

如何获取NSWindow关闭后的事件或通知?

嘿,这个问题问得很到位!你提到的windowWillClose:确实是窗口即将关闭但尚未完成关闭时触发的回调,如果你需要的是窗口完全关闭后的处理逻辑,这里有几个更合适的方案:

推荐解决方案

1. 官方首选:NSWindowDelegate的windowDidClose(_:)方法

这是Apple官方推荐的窗口关闭后回调方式,完全符合你的需求——它会在窗口彻底关闭完成后被调用。

实现步骤很简单:

  1. 让你的类遵守NSWindowDelegate协议
  2. 在类中实现该方法:
func windowDidClose(_ notification: Notification) {
    // 在这里编写窗口关闭后的业务逻辑
    print("窗口已经完全关闭啦!")
}
  1. 别忘了将目标窗口的delegate属性设置为你的类实例。

2. 备选方案:监听NSWindow.didCloseNotification通知

如果你不想使用代理模式,或者需要跨多个对象监听窗口关闭事件,可以通过通知中心来实现:

// 在初始化或视图加载等合适的时机注册通知
NotificationCenter.default.addObserver(
    self,
    selector: #selector(handleWindowClosed(_:)),
    name: NSWindow.didCloseNotification,
    object: targetWindow // 传入你要监听的窗口对象,nil则监听所有窗口
)

// 对应的通知处理方法
@objc private func handleWindowClosed(_ notification: Notification) {
    guard let closedWindow = notification.object as? NSWindow else { return }
    // 处理窗口关闭后的逻辑
    print("窗口\(closedWindow)已经关闭完成")
}

// 记得在对象销毁时移除观察者,避免内存泄漏
deinit {
    NotificationCenter.default.removeObserver(self)
}
关于windowWillClose(_:)的正确使用场景

这个方法的定位是关闭前的预处理,适合用来做这些事情:

  • 保存用户未提交的数据
  • 释放窗口关联的资源
  • 判断是否允许窗口关闭(通过修改通知的shouldClose属性)
    如果你的需求是关闭后执行逻辑,那这个方法就不是最优选择啦。

内容的提问来源于stack exchange,提问作者zhoudu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:14:07