我试图通过在以下函数中设置委托来使用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被正确调用。