iphone objective-c ios cocoa-touch uiwindow

iphone - Subclasificando UIWindow mientras usas guiones gráficos



objective-c ios (3)

Tengo el mismo problema que se explica en esta pregunta:

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

Mi pregunta es ¿cómo implemento un método getter ''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?


En mis propias aplicaciones, he visto la propiedad de " 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 momento.

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


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

class WinCustom : UIWindow{ .... }

entonces 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 }


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

ventana
Cuando se utiliza un guión gráfico, la aplicación debe presentar el guión gráfico agregándolo a una ventana y colocando esa ventana en 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 abra. Si el valor de la propiedad es nil (el 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 getter 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 objetivo

- (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 { } }