window.windowController равен nil внутри windowWillClose (), но не находится внутри viewDidAppear () - PullRequest
1 голос
/ 24 апреля 2019

Я безуспешно пытался ответить на такие события, как 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
}

Моя гипотеза оказалась верной (я думаю).

  1. Это та самая проблема, которая мешает мне получать эти событиявнутри NSWindowController?
  2. Есть ли другой способ добиться того же, не создавая больше ссылок на объекты?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...