Я безуспешно пытался ответить на такие события, как windowWillClose()
и windowShouldClose()
внутри NSWindowController (да, в соответствии с 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
не равен nil внутри 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
}
Моя гипотеза оказалась верной (я думаю).
- Это та самая проблема, которая мешает мне получать эти событиявнутри NSWindowController?
- Есть ли другой способ добиться того же, не создавая больше ссылок на объекты?