У меня возникают проблемы, когда я теряю ссылку на 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
, или я что-то не понимаю?
В коде есть несколько ошибок. Прежде всего, ваши переменные window1 и window2 должны быть дополнительными, поскольку они не инициализируются классом, и вы действительно будете устанавливать их значение в nil. - Кроме того, ваш CustomWindow1 не является подклассом чего-либо, вы, вероятно, хотите, чтобы он был подклассом NSWindow или NSWindowController. Как правило, вы инициализируете NSWindowController и сохраняете ссылку на него, а не на его окно. – ElmerCat
@ElmerCat Спасибо, что указали, что он должен быть факультативным. Во-вторых, извините, я забыл написать то, что я подклассифицировал. Да, это подкласс NSWindow. –