为什么NSWindow代表被覆盖?

时间:2017-11-01 16:23:55

标签: swift cocoa delegates

我试图通过在以下函数中设置委托来使用NSWindowDelegate windowWillClose 。它是在Interface Builder中设置的,没有委托链接(我尝试设置它但它不会连接)。 View Controller包含在另一个窗口控制器中。 此ViewController类实现NSWindowDelegate并按以下方式设置委托:

func prepare(对于segue:NSStoryboardSegue,发件人:Any?):

if segue.identifier=="My Segue"
{
    let v=segue.destinationController as! CenterWindowController
    chatWindowController=v
    v.window!.delegate=self
}

问题是在prepareForSegue之后覆盖了委托。

CenterWindowController(NSWindowController)是不正确的委托!

我通过覆盖NSWindow上的didSet属性找到了这个:

class MyWindow :NSWindow
{
    override var delegate: NSWindowDelegate? {
        willSet {
            Swift.print("WillSet aVar to \(newValue) from \(delegate)")
        }
        didSet { // this is my temporary solution , reversing the incorrect overwrite
            if let d=delegate as? CenterWindowController {
                delegate=oldValue
            }
        }
    }
}

如果我自己实例化窗口控制器,那么问题就不会发生:

let storyboard = NSStoryboard(name: "Main",bundle: nil)

if let vc = storyboard.instantiateController(withIdentifier: "Transport Detail") as? CenterWindowController,let f=view.window?.frame
{
    let tdc=vc.contentViewController as!  TransportDetailController
    tdc.transportController=self
    vc.window?.delegate=self

    vc.setCenterPos(f)
    vc.showWindow(vc)

    transportDetailWindowController=vc
}

如何禁用NSWindow代表的自动覆盖? 我应该采用另一种方式来解决关闭事件吗?是否可以由Interface Builder中的某些设置引起?

didSet 中实现修复后,问题消失了,我的委托windowWillClose被正确调用。

可能相关:Custom delegate for NSWindow

0 个答案:

没有答案