considere el siguiente escenario: tengo una aplicación basada en storyboard. Agrego un objeto ViewController al guión gráfico, agrego los archivos de clase para este ViewController en el proyecto y especifico el nombre de la nueva clase en el inspector de identidad de IB. Ahora, ¿cómo voy a referirme a este ViewController programáticamente desde AppDelegate? Hice una variable con la clase relevante y la convertí en una propiedad IBOutlet, pero no veo ninguna forma de poder hacer referencia al nuevo ViewController en código; cualquier intento de Ctrl-arrastrar una conexión no funciona .
es decir, dentro del AppDelegate puedo acceder al ViewController base de esta manera
(MyViewController*) self.window.rootViewController
pero ¿qué tal cualquier otro ViewController contenido en el guión gráfico?
fuente
Respuestas:
Echa un vistazo a la documentación para
-[UIStoryboard instantiateViewControllerWithIdentifier:]
. Esto le permite crear una instancia de un controlador de vista de su guión gráfico utilizando el identificador que configuró en el Inspector de atributos de IB:EDITADO para agregar código de ejemplo:
fuente
[[[self window] rootViewController] storyboard]
Según los documentos, esto devolverá el "guión gráfico desde el que se originó el controlador de vista". (o nulo si no proviene de un guión gráfico). Desde ese UIStoryboard * puede usar las llamadas de instancia que mencionó @RobinSummerhill. Tenga en cuenta que Storyboards crea instancias de nuevas instancias de sus viewControllers ( escenas ) según sean necesarias y no reutiliza las que se vieron anteriormente.Si usa
XCode
5, debe hacerlo de una manera diferente.UIViewController
enUIStoryboard
Identity Inspector
panel superior derechoUse Storyboard ID
casillaStoryboard ID
campoLuego escribe tu código.
fuente
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 AppDelegatedidFinishLaunchingWithOptions
:En Swift si sería muy similar:
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 usando
instantiateViewControllerWithIdentifier:
, 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!fuente
fuente