2015-09-02 3 views
0

У меня возникают проблемы, когда я теряю ссылку на NSWindows, объявленные в AppDelegate, с кодом ниже.Потеря ссылки на NSWindows в AppDelegate

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(), и избавиться от окон, как и ожидалось, но при вызове addWindowsAgain в AppDelegate, если не удается с lldb ошибкой. Does AppDelegate теряет эти оконные вары, когда вызывается close, или я что-то не понимаю?

+0

В коде есть несколько ошибок. Прежде всего, ваши переменные window1 и window2 должны быть дополнительными, поскольку они не инициализируются классом, и вы действительно будете устанавливать их значение в nil. - Кроме того, ваш CustomWindow1 не является подклассом чего-либо, вы, вероятно, хотите, чтобы он был подклассом NSWindow или NSWindowController. Как правило, вы инициализируете NSWindowController и сохраняете ссылку на него, а не на его окно. – ElmerCat

+0

@ElmerCat Спасибо, что указали, что он должен быть факультативным. Во-вторых, извините, я забыл написать то, что я подклассифицировал. Да, это подкласс NSWindow. –

ответ

2

NSWindow имеет переменную releasedWhenClosed, которая по умолчанию является true для созданных пользователем окон, если только окно не принадлежит контроллеру окна.

Задайте переменную false.

+0

спасибо. Но когда я повторно инициализую окна после их закрытия, кажется, что есть несколько экземпляров этого окна, несмотря на то, что после закрытия эти окна были нулевыми. –

Смежные вопросы