es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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étodo applicationDidFinishLaunching del AppDelegate:

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        if let windowController = NSStoryboard.main?.instantiateInitialController() as? WindowController {
            tabControllers.append(windowController)
        }
    }
    

    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.

Comments are closed.