2016-08-18 3 views
1

Scénario i possède deux contrôleurs de vue: Tabcontroller et Viewcontroller. Dans le premier je définis ma notification post et dans la seconde j'ai ajouté un observateur avec une méthode de réception.NSNotification Center ne fonctionne que dans un deuxième temps? TabbarController to NavigationController

Sur mon tabcontroller (expéditeur):

-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{ 

[[NSNotificationCenter defaultCenter] postNotificationName:@"RestartBtn" object:self userInfo:@{@"isHidden": @"YES"}]; 

} 

Sur le viewcontoller (récepteur):

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"HallOfFameView"); 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"RestartBtn" object:nil]; 

} 
-(void)receiveNotification:(NSNotification*)notification { 

    NSLog(@"%@",[notification name]); 
    _restartbutton.hidden=YES; 
    NSLog(@"%@",notification.userInfo[@"isHidden"]); 
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 
    [notificationCenter removeObserver:self name:@"RestartBtn" object:nil]; 
    } 

Quand je clique sur mon tabbaritem il poussera un contrôleur de vue et va imprimer "HallOfFameView" et je crois que cela enregistrera l'observateur mais n'exécutera pas la méthode de notification de réception à la première fois seulement une deuxième fois. Par exemple, lorsque je clique sur l'élément de la barre d'onglets ("Accueil"), il va exécuter la méthode de notification de réception.

Pourquoi ne travaille pas la première fois? et pourquoi cela fonctionnera quand j'ai déjà quitté le viewcontroller où je m'attends à travailler (c'est là que j'ajoute mon observateur).

+0

Ci-dessous mes œuvres de réponse? – user3182143

Répondre

1
  1. Vous avez raison. Le contrôleur de vue s'enregistre pour la notification, mais il ne reçoit pas la notification. La notification a déjà été déclenchée par le contrôleur de la barre d'onglets avant la création du contrôleur de vue et son enregistrement.

  2. Le contrôleur de barre d'onglets affiche cette notification pour chaque onglet sélectionné. Ainsi, lorsque vous appuyez sur un autre élément de la barre d'onglets, la notification est publiée et le contrôleur de vue est existant et le reçoit.

Il semble que ce que vous essayez de faire est de transmettre les informations du contrôleur de la barre d'onglets au contrôleur de vue. Il y a probablement une meilleure façon de le faire.

Si vous utilisez des storyboards, le contrôleur de la barre d'onglets utilise un segment pour passer à la scène du contrôleur de vue. Vous pouvez envisager de surcharger cette méthode sur votre contrôleur de barre d'onglets: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender qui vous donnera une chance de définir une propriété sur le 'contrôleur de vue de destination'.

+0

Merci, je comprends maintenant. En fait, vous devez d'abord ajouter un observateur et ensuite afficher des informations. Sans observateurs, le message aura disparu. Conclusion avec NSnotifications je dois toujours ajouter un observateur avant la notification post. N'est pas bon pour l'avenir, vous aurez toujours besoin de charger votre vue pour ajouter en premier lieu un observateur ... – ePascoal

+0

Oui, et vous ne pouvez même pas être sûr combien de temps la vue prendra à charger. Vous pourriez envisager de surcharger cette méthode sur le contrôleur de la barre d'onglets. - (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController .... vous pouvez vérifier si viewController est le contrôleur de classe de vue que vous voulez et ensuite définir une propriété là. Différentes façons de le faire. – ncke

+0

Oui je crois que prepareForSegue ne fonctionnera pas, la meilleure façon dont il semble que vous utilisiez '- (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController'. Êtes-vous d'accord? Si oui, vous pouvez modifier votre réponse. – ePascoal

0

Mettez votre observateur ajouter le codage dans la méthode viewWillAppear et supprimerons également observateur viewWillAppear

- (void)viewWillAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"RestartBtn" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"RestartBtn" object:nil]; 
} 
+0

Ne fonctionne pas pour moi .. J'ai utilisé une approche similaire à l'intérieur sur la méthode receiveNotification, mais je crois que mon problème est que je n'utilise pas NSNotification correctement puisque je dois définir un observateur en premier lieu, puis affiche des notifications à cet observateur. – ePascoal

+1

Publiez votre code complet frère je vais vous aider maintenant – user3182143

+0

Merci beaucoup pour votre aide, mais je utilise déjà - (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController à la place. et ça marche bien pour moi! – ePascoal