En general, el sistema debe manejar la creación de instancias del controlador de vista con un guión gráfico. Lo que desea es recorrer la jerarquía de viewController tomando una referencia a los self.window.rootViewController
controladores de vista en lugar de inicializarlos, que ya deberían inicializarse correctamente si ha configurado su guión gráfico correctamente.
Entonces, digamos que tu rootViewController
es un UINavigationController y luego quieres enviar algo a su controlador de vista superior, lo harías así en tu AppDelegate didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
En Swift si sería muy similar:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
Realmente no debería estar inicializando los controladores de vista usando los id. De guiones gráficos del delegado de la aplicación a menos que desee omitir la forma normal en que se carga el guión gráfico y cargar el guión gráfico usted mismo. Si tiene que inicializar escenas desde AppDelegate, lo más probable es que esté haciendo algo mal. Me refiero a que, por alguna razón, desea enviar datos a un controlador de vista en la parte inferior de la pila, AppDelegate no debería estar llegando a la pila del controlador de vista para establecer los datos. Eso no es asunto suyo. Su negocio es el rootViewController. ¡Deje que rootViewController maneje a sus propios hijos! Por lo tanto, si el sistema eliminara el proceso normal de carga del guión gráfico al eliminar referencias a él en el archivo info.plist, a lo sumo instanciaría el rootViewController usandoinstantiateViewControllerWithIdentifier:
, y posiblemente su raíz si es un contenedor, como un UINavigationController. Lo que desea evitar es crear instancias de controladores de vista que ya hayan sido instanciados por el guión gráfico. Este es un problema que veo mucho. En resumen, no estoy de acuerdo con la respuesta aceptada. Es incorrecto a menos que los carteles signifiquen eliminar la carga del guión gráfico de la lista de información, ya que de lo contrario habrá cargado 2 guiones gráficos, lo que no tiene sentido. Probablemente no sea una pérdida de memoria porque el sistema inicializó la escena raíz y la asignó a la ventana, pero luego apareció y la instanciaron nuevamente y la asignaron nuevamente. ¡Tu aplicación ha tenido un mal comienzo!