2011-06-09 3 views
0

Donc, je ne fais que tester NSNotifications sur une variété de cas et celui-ci est déroutant. J'apprécierais que vous puissiez m'aider à comprendre NSNotifications!Les contrôleurs de vue ne reçoivent parfois pas de NSNotification

J'ai un contrôleur de navigation.

J'ai un UIBarButtonItem appelé "Ajouter", qui affiche une notification DidAddNotification

Si je clique sur Ajouter cela me pousse à View2.

// I add view2 as observer and write method for this and NSlog if it gets implemented // 

Je nouveau me pousse à voir 3.

// I add view3 as another observer and use the same method as the previous view and I NSlog if it gets implemented// 

De 3 Voir, je popToRootViewControllerAnimated: OUI et je reviens à 1. et à nouveau suivre la même procédure.

Voilà donc comment le contrôle est ...

1 -> 2 -> 3 -> 1 

if I press add again, 

the control is again the same 1 -> 2-> 3-> 1 

est ici la sortie (NSLogs):

J'appuyez sur Ajouter pour la première fois:

2011-06-09 14:47:41.912 Tab[5124:207] I am the notification in view2 
2011-06-09 14:47:41.912 Tab[5124:207] I pressed Add Button and I just sent a notification from view 1 
    // No notification in view 3 ?? // I am now back to view 1. 

I appuyez de nouveau sur Ajouter:

2011-06-09 14:47:51.950 Tab[5124:207] I am the notification in view3 
2011-06-09 14:47:51.951 Tab[5124:207] I pressed Add Button and I just sent a notification from view 1 
// No Notification in view 2 ??? // ... I am now back to view 1. 

J'appuyez sur Ajouter une fois de plus:

2011-06-09 14:47:59.160 Tab[5124:207] I am the notification in view 3 
2011-06-09 14:47:59.161 Tab[5124:207] I pressed Add Button and I just sent a notification from view 1 

// No Notification in view 2 ??? // ... I am now back to view 1. 


And this goes on.. 

Quelqu'un pourrait-il me dire pourquoi

  1. NSLog ne sont pas imprimées en vue 3 pour la première fois, mais imprime tout autre moment?
  2. Pourquoi NSLog imprime-t-il dans la vue 2 pour la première fois et ne l'imprime plus jamais?

code:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DidAddNotification" object:self]; // I put this in the - (IBAction) for addData 

- (void)didPressAdd:(NSNotification *)notification { //NSLogs// } 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didPressAdd:) name:@"DidAddNotification" object:nil]; // I put this in the viewDidLoad of view 1 and view 2 
+1

s'il vous plaît code postal, votre question est trop longue et difficile à comprendre. –

+0

S'il vous plaît dites-moi quelle partie est difficile à comprendre, et je ferai de mon mieux pour l'éditer et le poster. – Legolas

+0

C'est bizarre que seules certaines notifications se déclenchent. Comment installez-vous les observateurs? – justin

Répondre

1

"La première fois que vous envoyez la notification, les autres contrôleurs de vue n'existent pas, ils n'ont pas encore été créés, le viewController est encore vide, car il n'y a aucun objet observateur. La deuxième fois, les deux objets dans les contrôleurs de vue ont été créés, ils reçoivent donc la notification comme ils sont en vie et le journal les déclarations de notification reçues. "

3

Les différences que vous décrivez semblent être en raison de changements dans lequel les objets sont en vie quand. Les vues et les contrôleurs de vue n'existent pas indéfiniment et ne sont pas tous créés au démarrage de l'application. Un objet doit exister pour recevoir et enregistrer une notification. Le système de notification de base fonctionne comme prévu. Vous devriez être en mesure de voir l'effet de la durée de vie sur les messages reçus si vous ajoutez des instructions de journal annonçant quand un objet supposé recevoir l'une de ces notifications est créé et lorsqu'il est détruit dans le corps de -init (ou -init (ou -init quel que soit l'initialisateur désigné de votre superclasse) et -dealloc.

En outre: Vos relevés de journal seront plus faciles à retrouver si vous les marquez avec la fonction de journalisation comme NSLog(@"%s: <message>", __func__). Le compilateur génère une chaîne nommée __func__ pour chaque fonction qui contient le nom de la fonction.

1

Je viens de configurer une application basée sur la navigation.Dans l'en-tête du contrôleur racine, j'ai ceci:

#import <UIKit/UIKit.h> 

extern NSString * const EPNotification; 

@interface RootViewController : UITableViewController { 
} 
@end 

Tout ce que je l'ai fait différent, il a été mis en place une chaîne à utiliser tout au long du code. Puis dans le fichier de mise en œuvre de la racine, j'ai ce (plus tous les trucs standard):

#import "RootViewController.h" 
#import "One.h" 

NSString *const EPNotification = @"Notification"; // this will be the global string name for the notification 

@implementation RootViewController 


#pragma mark - 
#pragma mark View lifecycle 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gotNotification:) name:EPNotification 
              object:nil]; 

    UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain               target:self action:@selector(sendNotification)]; 

    self.navigationItem.rightBarButtonItem = next; 
    [next release]; 
} 

- (void)sendNotification { 
    NSDictionary *d = [NSDictionary dictionaryWithObject:@"view 1" forKey:@"sender"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification" object:self userInfo:d]; 
    One *o = [[One alloc] initWithNibName:@"One" bundle:nil]; 
    [self.navigationController pushViewController:o animated:YES]; 
    [o release]; 
} 

- (void)gotNotification:(NSNotification *)note { 
    NSLog(@"from %@", [[note userInfo] objectForKey:@"sender"]); 
} 

J'ai 3 autres points de vue (un, deux et trois, respectivement), qui sont à peu près tous exactement la même . Rien dans l'en-tête (à part les trucs standard). Je posterai un des fichiers .m pour que vous puissiez voir l'installation.

#import "One.h" 
#import "Two.h" 

@implementation One 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain 
                target:self action:@selector(sendNotification)]; 

    self.navigationItem.rightBarButtonItem = next; 
    [next release]; 
} 

- (void)sendNotification { 
    NSDictionary *d = [NSDictionary dictionaryWithObject:@"view 2" forKey:@"sender"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification" object:self userInfo:d]; 
    Two *t = [[Two alloc] initWithNibName:@"Two" bundle:nil]; 
    [self.navigationController pushViewController:t animated:YES]; 
    [t release]; 
} 

Et honnêtement, c'est à peu près tout. Sur ma classe trois, je saute au contrôleur de racine au lieu de créer un nouveau contrôleur de vue, mais c'est tout. Il vous indique la vue à laquelle vous vous trouvez à chaque clic sur le bouton. Nous espérons que cela vous aidera à mieux comprendre le fonctionnement des notifications.

+0

Merci beaucoup pour le temps mec. Je n'ai aucune idée de pourquoi cela m'arrive. Je sais que cela ne peut pas être la raison - (LOL) mais permettez-moi de vous demander ceci ... Quel Xcode utilisez-vous? J'utilise le dernier avec ios5 sdk beta. – Legolas

+0

Haha, je ne sais pas ce qui se passe avec le tien non plus. J'utilise Xcode 3 avec iOS 4.3, ce qui pourrait être pourquoi. J'en doute un peu, mais on ne sait jamais. Selon la WWDC, je sais qu'ils ont changé le système de notification, mais je ne pense pas que cela ait quelque chose à voir avec NSNotificationCenter, mais on ne sait jamais – justin

+0

. Les chances sont extrêmement faibles qu'ils changeraient quelque chose comme ça dans ios5 sdk. Lol. Si je mets cela sur developer.apple.com et leur demande ils LOL à la possibilité. Je vais m'asseoir et analyser à nouveau le code ... (soupir)! Merci pour l'aide mec. – Legolas

Questions connexes