如何获取NSWindow关闭后的事件或通知?
嘿,这个问题问得很到位!你提到的windowWillClose:确实是窗口即将关闭但尚未完成关闭时触发的回调,如果你需要的是窗口完全关闭后的处理逻辑,这里有几个更合适的方案:
推荐解决方案
1. 官方首选:NSWindowDelegate的windowDidClose(_:)方法
这是Apple官方推荐的窗口关闭后回调方式,完全符合你的需求——它会在窗口彻底关闭完成后被调用。
实现步骤很简单:
- 让你的类遵守
NSWindowDelegate协议 - 在类中实现该方法:
func windowDidClose(_ notification: Notification) { // 在这里编写窗口关闭后的业务逻辑 print("窗口已经完全关闭啦!") }
- 别忘了将目标窗口的
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
相关产品推荐
相关产品推荐

