2016-04-27 36 views
0

[首先,请注意我没有使用Interface Builder]Modal 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?;和SetupSheetControllerNSWindowController子类。

当用户完成此表格时,self.window?.sheetParent?.endSheet(self.window!, returnCode: NSModalResponseXXX)setupController调用。

我的问题是,模态NSWindow和它的控制器都没有获得释放。当我重新打开模态表单时,它们也不会被重用。 另请注意,我没有在此处显示的其他地方参考控制器。 想法?

回答

0

好的......原来我不得不nil窗外本身,虽然使用一些间接:win.windowController?.window = nil(要写在beginSheet的completionHandler)。

但它看起来对我来说不是很优雅。有没有其他方法?

+0

我认为一般的想法是,一旦创建了窗口,它们应该在应用程序生命周期中重用。创建窗口很昂贵,因此默认行为是在第一次请求显示时懒惰地创建窗口,然后在完成后隐藏窗口。当然,这也需要您保持对控制器的持续参考。 – pco494