2016-04-27 8 views
0

freigegeben [Erste, bitte beachten Sie, ich bin nicht mit Interface Builder]Modal NSWindow nie

Ich habe ein NSWindow als modaler ausgewiesen werden, wenn ein Menüpunkt angeklickt wird. Hier ist die Anzeige der Code es:

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 als Instanzvariable var setupController: SetupSheetController? definiert ist; und SetupSheetController eine NSWindowController Unterklasse ist.

Wenn der Benutzer mit diesem Blatt fertig ist, wird self.window?.sheetParent?.endSheet(self.window!, returnCode: NSModalResponseXXX) von der setupController aufgerufen.

Mein Problem ist, dass weder das modale NSWindow noch sein Controller freigegeben werden. Und sie werden nicht wiederverwendet, wenn ich das modale Blatt wieder öffne. Bitte beachten Sie auch, dass ich den Controller an keiner anderen Stelle als hier gezeigt referenziere. Ideen?

Antwort

0

OK ... Es stellte sich heraus, dass ich zu nil aus dem Fenster hatte sich, obwohl einige indirection mit: win.windowController?.window = nil (in der beginSheet ‚s completionHandler geschrieben werden).

Aber es sieht nicht sehr elegant für mich aus. Gibt es einen anderen Weg?

+0

Ich denke, die allgemeine Idee ist, dass sobald Windows erstellt werden, sollten sie für die Dauer der App-Lebensdauer wiederverwendet werden. Das Erstellen von Fenstern ist teuer und daher ist das Standardverhalten, das Fenster langsam zu erstellen, wenn es zum ersten Mal angezeigt wird, und es dann einfach zu verbergen, sobald es fertig ist. Das erfordert natürlich auch, dass Sie einen dauerhaften Verweis auf den Controller behalten. – pco494