iphone - para - Accede al controlador de vista que empujó el controlador de vista visible
el controlador necesario para este iphone no esta instalado (1)
Tengo una aplicación que tiene un UINavigationController
que empuja a UITabBarController
a la vista. Este UITabBarController
tiene cuatro pestañas, una de las cuales muestra un UIViewController
personalizado, una instancia de EventInformationViewController
. Un botón en este controlador de vista personalizado a su vez empuja a otro controlador de vista personalizada EventRatingAddViewController
a la vista. Una acción en este controlador de vista debe invocar un método en la instancia EventInformationViewController
. El siguiente código hace que la aplicación falle en su lugar:
// get the index of the visible VC on the stack
int myIindex = [self.navigationController.viewControllers indexOfObject:self.navigationController.visibleViewController];
// get a reference to the previous VC
EventInformationViewController *prevVC = (EventInformationViewController *)[self.navigationController.viewControllers objectAtIndex:myIindex - 1];
[prevVC performSelector:@selector(rateCurrentEvent:)];
Pensé que la propiedad viewControllers conservaba una matriz de todos los VC en la pila de navegación, por lo que el índice, el menos visible uno, debería apuntar al VC que empujaba al VC actualmente visible a la vista. Por el contrario, parece apuntar a mi UITabBarController
:
-[UITabBarController rateCurrentEvent:]: unrecognized selector sent to instance
¿Qué pasa con eso y, lo que es más importante, cómo obtengo un puntero al VC que empuja el VC visualizable actualmente a la vista?
EDITAR: Terminé creando un protocolo de delegado para EventRatingAddViewController
y asignando EventInformationViewController
como delegado. Esto funciona bien, todavía estoy pensando que debería haber una manera de acceder al VC que empuja a través de la pila de navegación.
Estoy bastante seguro de que UITabBarController
efectivamente presionó su controlador de vista actual, pero que lo que está buscando es el controlador de vista de una de las pestañas de este UITabBarController
, el controlador de vista que estaba visible en el UITabBarController
en el momento de este UITabBarController
empujó su controlador de vista en la pila de navegación. Posiblemente este UITabBarController
empujó su controlador de vista en la pila, porque el controlador de vista de la pestaña visible lo indicó, por lo que sería algo como esto: [self.tabBarController.navigationController pushViewController:someViewController];
.
La forma de averiguar qué controlador de vista se mostró en el UITabBarController
en el momento en que su controlador de vista se UITabBarController
en la pila, es usar la propiedad .selectedViewController
, de modo que resulte algo como esto:
// get the index of the visible VC on the stack
int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];
// get a reference to the previous VC
UITabBarController *prevVC = (UITabBarController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1];
// get the VC shown by the previous VC
EventInformationViewController *prevShownVC = (EventInformationViewController *)prevVC.selectedViewController;
[prevShownVC performSelector:@selector(rateCurrentEvent:)];