2016-04-27 7 views
0

[Во-первых, обратите внимание, что я не использую Interface Builder]Модальные NSWindow не выпустили

У меня есть NSWindow показывается как модальный листа, когда элемент меню получает щелчок. Вот код его отображения:

let win = NSWindow(contentRect: NSRect(origin: NSZeroPoint, size: NSSize(width: 650, height: 400)), styleMask: NSResizableWindowMask, backing: .Nonretained, defer: false) 
win.releasedWhenClosed = true 
setupController = SetupSheetController(window: win) 
mainWindow.beginSheet((setupController!.window)!) { (response: NSModalResponse) in 
    print("didClose") 
    self.setupController = nil 
} 

setupController определяется как экземпляр переменной var setupController: SetupSheetController?; и SetupSheetController является подклассом NSWindowController.

В то время, когда пользователь закончил работу с этим листом, self.window?.sheetParent?.endSheet(self.window!, returnCode: NSModalResponseXXX) вызывается setupController.

Моя проблема заключается в том, что ни модальный NSWindow, ни его контроллер не освобождаются. И они не используются повторно, когда я снова открываю модальный лист. Также обратите внимание, что я не ссылаюсь на контроллер в любом другом месте, кроме показанного здесь. Идеи?

ответ

0

ОК ... Оказывается, мне пришлось nil из самого окна, хотя с использованием какого-то косвенного направления: win.windowController?.window = nil (будет записано в файле завершения beginSheet).

Но для меня это выглядит не очень элегантно. Есть ли другой путь ?

+0

Я думаю, что общая идея заключается в том, что после создания окон они должны использоваться повторно на протяжении всей жизни приложения. Создание окон является дорогостоящим, и поэтому поведение по умолчанию заключается в том, чтобы создать окно лениво при первом запросе на показ, а затем просто скрыть его после его завершения. Конечно, это также требует, чтобы вы сохраняли постоянную ссылку на контроллер. – pco494