Entonces, empujo un controlador de vista de RootViewController como:
[self.navigationController pushViewController: otroViewController animado: SÍ];
PERO, DESDE anotherViewController
ahora, quiero acceder al RootViewController nuevamente.
Lo estoy intentando
// (ahora dentro de otro ViewController) /// RootViewController * root = (RootViewController *) self.parentViewController; // No. // err RootViewController * root = (RootViewController *) [self.navigationController.viewControllers objectAtIndex: 0]; // ¡¡SI!! funciona
No estoy seguro de POR QUÉ esto funciona y no estoy seguro de si es la mejor manera de hacerlo. ¿Alguien puede comentar sobre una mejor manera de obtener el RootViewController de un controlador que ha introducido en ese RootViewController navigationController y si la forma en que lo hice es confiable o no?
ios
iphone
uinavigationcontroller
bobobobo
fuente
fuente
Respuestas:
Use la propiedad viewControllers de UINavigationController. Código de ejemplo:
Esta es la forma estándar de obtener el controlador de vista "posterior". La razón
objectAtIndex:0
funciona porque el controlador de vista al que está intentando acceder también es el raíz, si fuera más profundo en la navegación, la vista posterior no sería la misma que la vista raíz.fuente
rootViewController
falta*
antes, y el índice debería estar solo0
. El código en la pregunta es correcto:RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
Versión rápida:
Versión ObjectiveC:
Donde self es una instancia de un UIViewController incrustado en un UINavigationController.
fuente
Una versión un poco menos fea de lo mismo mencionado en casi todas estas respuestas:
en su caso, probablemente haría algo como:
dentro de su subclase UINavigationController :
entonces puedes usar:
editar
OP solicitó una propiedad en los comentarios.
si lo desea, puede acceder a esto a través de algo como
self.navigationController.rootViewController
simplemente agregando una propiedad de solo lectura a su encabezado:fuente
Para todos los que estén interesados en una extensión rápida, esto es lo que estoy usando ahora:
fuente
Como una adición a la respuesta de @ dulgan , siempre es un buen método para usar
firstObject
overobjectAtIndex:0
, porque mientras que el primero devuelve nil si no hay ningún objeto en la matriz, el último arroja una excepción.Alternativamente, sería una gran ventaja para usted crear una categoría llamada
UINavigationController+Additions
y definir su método en eso.fuente
¿Qué tal pedirle al singleton UIApplication su keyWindow , y desde ese UIWindow pedir el controlador de vista raíz (su propiedad rootViewController ):
fuente
Aquí se me ocurrió un método universal para navegar desde cualquier lugar a la raíz.
Crea un nuevo archivo de clase con esta clase, para que sea accesible desde cualquier parte de su proyecto:
Uso desde cualquier parte de su proyecto:
fuente
Esto funcionó para mí:
Cuando mi controlador de vista raíz está incrustado en un controlador de navegación:
Recuerda que
keyWindow
está en desuso.fuente