2010-07-06 15 views
8

Tengo una aplicación que tiene un UINavigationController que empuja un UITabBarController en 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 personalizada a su vez empuja a otro controlador de vista personalizado 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 el accidente de aplicación en su lugar:Llegar al controlador de vista que empujó el controlador de vista visible

// 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 mantuvo una matriz de todos los VC en la pila de navegación, por lo que el índice de la que actualmente visibles menos uno debe apuntar a la VC que empujó el actualmente visible VC a la vista. Más bien, parece apuntar a mi UITabBarController:

-[UITabBarController rateCurrentEvent:]: unrecognized selector sent to instance 

¿Qué pasa con eso y más importante aún, ¿cómo puedo obtener un puntero a la VC que empujó el VC Actualmente visisble a la vista?

EDITAR: Terminé creando un protocolo de delegado para el EventRatingAddViewController y asignando el 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.

+1

No es una respuesta a su pregunta, pero debe usar '.topViewController' en lugar de' .visibleViewController' ya que este último también podría ser un controlador de vista presentado modalmente que no tiene nada que ver con la pila de controladores de navegación. –

+0

¿Has intentado iniciar sesión en 'myIindex' y en el índice de ese UITabBarController que obtienes? –

+0

Buen punto sobre el topViewController. No hace una diferencia en este caso, ya que no tengo VCs modales en mi aplicación. El VC visible obtiene el índice 2, UITabBarController 1. – mvexel

Respuesta

6

estoy bastante seguro de que, efectivamente, que UITabBarController empujar a su controlador de vista actual, sino que lo que se busca es la vista del controlador de uno de estos UITabBarController 's de pestañas, el controlador opinión de que era visible en el UITabBarController en el momento en que 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 manera de averiguar lo que Vista Controlador se muestra en la UITabBarController en el momento de su controlador de vista se inserta en la pila, es el uso de la propiedad .selectedViewController, por lo que se traduciría en 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:)]; 
Cuestiones relacionadas