2010-07-06 4 views
8

J'ai une application qui a un UINavigationController qui affiche un UITabBarController. Ce UITabBarController a quatre onglets, dont l'un montre un UIViewController personnalisé, une instance de EventInformationViewController. Un bouton de ce contrôleur de vue personnalisé enfonce à son tour un autre contrôleur de vue personnalisé EventRatingAddViewController. Une action dans ce contrôleur de vue doit appeler une méthode dans l'instance EventInformationViewController. Le code suivant fait l'accident d'application à la place:Accédez au contrôleur de vue qui a poussé le contrôleur de vue 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:)]; 

Je pensais que la propriété viewControllers a gardé un tableau de tous les circuits virtuels sur la pile de navigation, de sorte que l'indice d'une moins un actuellement visible doit pointer vers le VC qui a poussé la VC actuellement visible dans la vue. Au contraire, il semble pointer vers mon UITabBarController:

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

Qu'est-ce avec cela et plus important encore, comment puis-je obtenir un pointeur vers le VC qui a poussé le VC actuellement visisble en vue?

EDIT: J'ai fini par créer un protocole de délégué pour le EventRatingAddViewController et en affectant le EventInformationViewController en tant que délégué. Cela fonctionne bien - encore je pense qu'il devrait y avoir un moyen d'accéder à la VC de poussée à travers la pile de navigation.

+1

Pas une réponse à votre question, mais vous devriez utiliser '.topViewController' au lieu de' .visibleViewController' car ce dernier pourrait également être un contrôleur de vue présenté de façon modale qui n'a rien à voir avec votre pile de contrôleur de navigation! –

+0

Avez-vous essayé d'enregistrer 'myIindex' et l'index de ce UITabBarController vous obtenez? –

+0

Bon point sur le topViewController. Ne fait pas de différence dans ce cas, car je n'ai pas de VC modale dans mon application. Le VC visible obtient l'index 2, le UITabBarController 1. – mvexel

Répondre

6

Je suis assez sûr que ce UITabBarController ne fait pousser votre contrôleur de vue actuel, mais ce que vous cherchez est le contrôleur de vue d'un de ces onglets « s UITabBarController, le contrôleur de vue qui était visible dans le UITabBarController à le temps que ce UITabBarController a poussé votre contrôleur de vue sur la pile de navigation. Il est possible que ce UITabBarController ait poussé votre contrôleur de vue sur la pile, parce que le contrôleur de vue de l'onglet visible lui a demandé de le faire: [self.tabBarController.navigationController pushViewController:someViewController];.

La façon de savoir ce que vue contrôleur a été montré dans le UITabBarController au moment où votre contrôleur de vue a été poussé sur la pile, est d'utiliser la propriété .selectedViewController, de sorte que se traduirait par quelque chose comme ceci:

// 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:)]; 
Questions connexes