【问题标题】:Losing reference to NSWindows in AppDelegate在 AppDelegate 中失去对 NSWindows 的引用
【发布时间】:2015-09-02 06:05:30
【问题描述】:

我遇到的问题是我失去了对 AppDelegate 中声明的 NSWindows 的引用,代码如下。

class AppDelegate: NSObject, NSApplicationDelegate {
    var window1: CustomWindow1!
    var window2: CustomWindow2!

    func setupWindows() {
        self.window1 = CustomWindow1()
        self.window2 = CustomWindow2()
        let vc2 = VIEWOFSOMEVIEWCONTROLLER()
        self.window2.contentView.addSubview(vc2.view)
        self.window1.grandchildVC = vc2
        self.window1.addChildWindow(self.window2!, ordered: NSWindowOrderingMode.Above)
        // etc.
    }

    @IBAction addWindowsAgain(sender: AnyObject) {
        // This is where if fails
        if self.window1 != nil {
            self.window1 == nil
        }
    }
}

class CustomWindow1() {
    var grandchildVC: NSViewController
    func deleteChildWindowThenSelf() {
        self.grandchildVC.view.window.close()
        self.close()
    }
}

我可以调用deleteChildWindowThenSelf(),并按预期摆脱窗口,但是在AppDelegate 中调用addWindowsAgain 时,如果失败并出现lldb 错误。调用 close 时 AppDelegate 是否会丢失这些窗口变量,还是我误解了什么?

【问题讨论】:

  • 您的代码有几个问题。首先,您的 window1 和 window2 变量应该是可选的,因为它们不会使用类进行初始化,并且您确实会将它们的值设置为 nil。 -- 此外,您的 CustomWindow1 不是任何东西的子类,您可能希望它是 NSWindow 或 NSWindowController 的子类。通常,您初始化一个 NSWindowController 并保留对它的引用,而不是它的窗口。
  • @ElmerCat 感谢您指出它应该是可选的。其次,对不起,我忘了写我的子类。是的,它是 NSWindow 的子类。

标签: macos swift cocoa


【解决方案1】:

NSWindow 有一个变量releasedWhenClosed,对于自定义创建的窗口,默认情况下它是true,除非该窗口归窗口控制器所有。

将变量设置为false

【讨论】:

  • 谢谢。但是当我在关闭它们后重新初始化窗口时,似乎有多个该窗口的实例,尽管在关闭后将这些窗口设置为 nil。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多