subclassing UIWindow al usar storyboards

Tengo el mismo problema que se explica en esta pregunta:

¿Dónde puedo cambiar la ventana que usa mi aplicación desde UIWindow a mi propia subclase “MyWindow” con el guión gráfico?

Mi pregunta es ¿cómo implemento un método getter de ‘ventana’ en mi delegado de aplicación que devuelve la subclase ‘MyWindow’? ¿O tal vez hay otras formas de asignar mi subclase a la ventana principal de mi aplicación?

UIWindow en un proyecto Storyboard se puede subclasificar como se explica en la referencia UIApplicationDelegate de Apple:

ventana
Cuando se usa un guión gráfico, la aplicación debe presentar el guión gráfico al agregarlo a una ventana y poner esa ventana en la pantalla. La aplicación consulta esta propiedad para la ventana. La referencia retenida a la ventana por esta propiedad es necesaria para evitar que la ventana se libere. Si el valor de la propiedad es nil (valor predeterminado), la aplicación crea una instancia genérica de UIWindow y la asigna a esta propiedad para que el delegado haga referencia. Puede implementar el método captador de este protocolo para proporcionar a la aplicación una ventana diferente.

En otras palabras, en su implementación de AppDelegate simplemente agregue el siguiente getter

C objective

 - (MyCustomWindow *)window { static MyCustomWindow *customWindow = nil; if (!customWindow) customWindow = [[MyCustomWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; return customWindow; } 

Rápido

 var customWindow: MyCustomWindow? var window: UIWindow? { get { customWindow = customWindow ?? MyCustomWindow(frame: UIScreen.mainScreen().bounds) return customWindow } set { } } 

En mis propias aplicaciones, he visto la propiedad ” window ” declarada en AppDelegate.h al crear una nueva aplicación a partir de las plantillas de Xcode.

Puede modificar esa propiedad para cambiar de ” UIWindow ” a ” MyWindow ” en ese punto.

O, una solución menos elegante, simplemente puede convertir el retorno de la window a un tipo de objeto ” MyWindow ” cuando acceda a él.

No es tan difícil que vayas a la primera subclase UIWindow

 class WinCustom : UIWindow{ .... } 

luego en AppDelegate:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { self.window = WinCustom(frame: UIScreen.main.bounds) self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() return true }