window.windowController在windowWillClose()内为nil,但不在viewDidAppear()内

问题描述 投票:1回答:1

我尝试过但未成功地响应NSWindowController中的windowWillClose()windowShouldClose()之类的事件(是的,它符合NSWindowDelegate)。

后来,令我惊讶的是,如果我使我的contentViewController(NSViewController)符合NSWindowDelegate,我就能收到这些事件。

遗憾的是,后来发现view.window?.windowControllernil中的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
}

我的假设被证明是正确的(我认为)。

  1. 这是同样的问题导致我无法在NSWindowController内接收这些事件吗?
  2. 还有另一种方法可以在不创建更多对象引用的情况下实现相同的目的吗?
swift macos nswindowcontroller
1个回答
0
投票

为了发布代码,我使用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发出通知…

© www.soinside.com 2019 - 2024. All rights reserved.