我尝试过但未成功地响应NSWindowController中的windowWillClose()
和windowShouldClose()
之类的事件(是的,它符合NSWindowDelegate)。
后来,令我惊讶的是,如果我使我的contentViewController(NSViewController)符合NSWindowDelegate,我就能收到这些事件。
遗憾的是,后来发现view.window?.windowController
或nil
中的windowWillClose()
是windowShouldClose()
,代码:
override func viewDidAppear() {
super.viewDidAppear()
self.view.window?.delegate = self
self.view.window?.windowController // not nil!
}
func windowWillClose(_ notification: Notification) {
self.view.window?.windowController // nil!!
}
func windowShouldClose(_ sender: NSWindow) -> Bool {
self.view.window?.windowController // nil!!
return true
}
[意识到view.window?.windowController
中的viewDidAppear()
不为零后,我接下来想到的是Swift垃圾收集了控制器,因此我以创建另一个viewDidAppear()
引用的方式更改了windowController
,从而防止了垃圾回收。表示对象,代码:
var windowController: NSWindowController?
override func viewDidAppear() {
super.viewDidAppear()
self.view.window?.delegate = self
windowController = view.window?.windowController
}
func windowWillClose(_ notification: Notification) {
self.view.window?.windowController // NOT nil
}
func windowShouldClose(_ sender: NSWindow) -> Bool {
self.view.window?.windowController // NOT nil
return true
}
我的假设被证明是正确的(我认为)。
为了发布代码,我使用Answer选项,即使它更多是注释。
我在NSViewController中添加:
override func viewDidAppear() {
super.viewDidAppear()
parentWindowController = self.view.window!.windowController
self.view.window!.delegate = self.view.window!.windowController as! S1W2WC. // The NSWC class, which conforms to NSWindowDelegate
print(#function, "windowController", self.view.window!, self.view.window!.windowController)
}
我得到打印日志:viewDidAppear()windowController Optional()
并且通知已通过。
但是如果我改为
override func viewDidAppear() {
super.viewDidAppear()
// parentWindowController = self.view.window!.windowController
self.view.window!.delegate = self.view.window!.windowController as! S1W2WC
print(#function, "windowController", self.view.window!, self.view.window!.windowController)
}
通过注释parentWindowController,不再向WindowController发出通知…