El controlador de vista inicial/controlador de ventana/ventana sigue retenido después de cerrar la ventana, ¿cómo lo desinicializo?
Tengo una aplicación para macOS que abre varias pestañas. Cuando se abre una nueva pestaña, es retenida por el app delegate:
class AppDelegate: NSObject, NSApplicationDelegate {
var tabControllers:[WindowController] = []
}
class WindowController: NSWindowController, NSWindowDelegate {
override func windowDidLoad() {
super.windowDidLoad()
(NSApp.delegate as? AppDelegate)?.tabControllers.append(self)
self.window?.delegate = self
}
@IBAction override func newWindowForTab(_ sender: Any?) {
if let wc = NSStoryboard.main?.instantiateInitialController() as? WindowController,
let window = wc.window {
self.window?.addTabbedWindow(window, ordered: .below)
window.order(.above, relativeTo: self.window.hashValue)
}
}
func windowWillClose(_ notification: Notification) {
if let window = notification.object as? NSWindow,
let wc = window.windowController as? WindowController,
let index = tabControllers.firstIndex(of: wc) {
(NSApp.delegate as? AppDelegate)?.tabControllers.remove(at: index)
}
}
}
Para todas las pestañas recién creadas, este código garantiza que cuando se abre la nueva pestaña, existe una referencia fuerte que la mantiene viva. Cuando el usuario va a cerrar la pestaña, se elimina la referencia fuerte, lo que desinicializa el objeto. Funciona muy bien, excepto para el controlador de la ventana inicial con el que la aplicación comienza. Si el usuario agrega una nueva pestaña y cierra la primera ventana/pestaña, se ejecuta todo el código anterior, pero la ventana inicial no se desinicializa.
¿Cómo puedo desinicializar esa primera ventana/pestaña?
davy.ai
Dado que el controlador de ventana inicial no se agrega a la matriz
tabControllers
, no se desinicializa automáticamente. Para asegurar su desinicialización, puedes agregarlo a la matriz en el métodoapplicationDidFinishLaunching
del AppDelegate:Ahora, cuando el usuario cierre la primera ventana/pestaña, se llamará al método
windowWillClose
y se desinicializará la ventana/pestaña inicial junto con las demás.