2011-06-30 4 views
1

Je dois recharger les données dans un contrôleur de vue lorsque l'on clique sur un onglet.Objectif C: Comment recharger la vue de table d'un contrôleur de vue lorsqu'un onglet est sélectionné

J'utilise la méthode UITabBarControllerDelegate comme ci-dessous:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
    if (tabBarController.selectedIndex == 3) 
    { 
     [(SomeViewController *)viewController getData]; 
    } 
} 

où 'getData' est une méthode d'instance en classe SomeViewController. Cependant quand je lance mon application, je reçois l'erreur suivante

2011-07-01 02:12:11.193 onethingaday[19169:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController getData]: unrecognized selector sent to instance 0x600d500' 

Quelqu'un peut-il me conseiller comment je peux résoudre ce problème? J'ai juste besoin de déclencher la méthode « getdata » lorsque l'index tabbarcontroller.selected == 3

Répondre

2

Il me semble du message d'erreur que vous obtenez, que vous utilisez un UINavigationController dans votre contrôleur d'onglet; dans ce cas, vous ne pouvez pas envoyer directement le message getData; vous devriez d'abord savoir quel contrôleur de vue sous le UINavigationController devrait recevoir ce message. (Ce n'est pas réellement lié à la barre d'onglets selectedIndex)

Je ne sais pas comment votre UINavigationController est organisé, mais vous pouvez faire:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 
    if (tabBarController.selectedIndex == 3) { 

    //-- option 1: getData goes to the first view controller in the UINavigationController: 
     [[(SomeViewController*)[(UINavigationController*)viewController topViewController] getData]; 

    //-- option 2: getData goes to the last view controller in the UINavigationController (the visible one): 
     [[(SomeViewController*)[(UINavigationController*)viewController visibleViewController] getData]; 

    } 
} 

Si vous donnez plus de détails sur l'organisation de votre UINavigationController Je peux aider à identifier davantage la bonne option. Quoi qu'il en soit, comme vous pouvez le voir dans les moulages, il y a quelque chose qui ne va pas complètement avec votre conception. Je suggère fortement d'utiliser une notification pour cela. À savoir, votre SomeViewController lui-même registres pour une notification d'un type donné:

[[NSNotificationCenter defaultCenter] addObserver:self 
          selector:@selector(someSelector:) 
          name:ShouldGetDataNotification 
          object:nil]; 

et le contrôleur de barre d'onglet envoie la notification de votre contrôleur pour réagir sur:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 
    if (tabBarController.selectedIndex == 3) { 

     [[NSNotificationCenter defaultCenter] postNotificationName:ShouldGetDataNotification object:nil]; 
    } 
    .... 
} 

Regardez this post.

1
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
    if (tabBarController.selectedIndex == 3) 
    { 
     [[[(UINavigationController *)viewController viewControllers] objectAtIndex:2] getData];//2 for 3rd tabbar since 0,1,2 



    } 
} 
1

Vous pouvez implémenter la méthode -viewWillAppear dans votre sous-classe UITableViewController. Cela doit être appelé automatiquement lorsque le UITabBarController bascule vers la vue. Cela devrait ressembler à ceci:

- (void)viewWillAppear { 
    [super viewWillAppear]; 
    [self getData]; 
} 
Questions connexes