2010-01-21 4 views
14

Ich versuche, eine Instanz der Verwendung NSNotificationCenter mit addObserver und postNotificationName zu bekommen, aber ich kann nicht herausfinden, warum es nicht funktioniert.NSNotification nicht gesendet, wenn postNotificationName:

Ich habe 2 Zeilen Code, um den Betrachter zu addieren und die Nachricht in zwei verschiedenen Klassen

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(newEventLoaded:) name:@"Event" object:nil]; 

und

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self]; 

senden Wenn ich den Namen nil gesetzt funktioniert es gut becuase es gerade ist eine Sendung, wenn ich versuche, einen Benachrichtigungsnamen zu definieren, die Nachrichten nie durchkommen. diese

Antwort

12

Alle meine Code nutzt NSNotifications wie so:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil]; 

Die erste ist die Benachrichtigung der Registrierung und die zweite Veröffentlichung der Mitteilung.

+3

Dies ist genau das, was ich noch habe, weigert sich zu arbeiten, führt mich zu der Annahme, dass das Problem woanders ist, aber das Notification Center scheint ziemlich in sich geschlossen Code-weise. Ich habe keine Ahnung, wo ich sonst nachsehen könnte, was das Problem verursachen könnte. Threading vielleicht? Kopiert das iPhone automatisch mehrere Threads? Nicht, dass ich davon Wüste. – Affian

+0

Funktioniert eine NSLog-Anweisung im Selektor (in meinem Fall updateView) ordnungsgemäß? Wenn Ihre Methode keine Parameter akzeptiert, versuchen Sie den Methodennamen ohne: so '[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (newEventLoaded) Name: @" Event "Objekt: nil];' –

+0

Alle meine Tests haben wurde mit einem NSLog in der ausgewählten Methode gemacht und es funktioniert, wenn ich den Namen des Notifier auf Null gesetzt. Ich habe es auch mit und ohne Parameter in der Methode – Affian

5

Wechsel:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self]; 

dazu:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil]; 

Wenn Ihre erste Benachrichtigung ordnungsgemäß registriert ist, newEventLoaded aufgerufen werden soll.

+1

Kein Glück habe ich verschiedene Kombinationen der Objektwerte und die Ereigniswerte, aber die einzige versuchte, dass ich es scheint der Name als Null gesetzt bekommen arbeiten kann, ist mit, wenn ich etwas in das fehlt bin Dokumentation. – Affian

+1

+1. Vielen Dank! Das hat mir geholfen – Dexter

+0

+1 Das hat mir geholfen, danke –

1

Haben Sie schon andere Namen ausprobiert, aber @ "Event" und nil? Nur um sicher zu gehen, könnten Sie Ihre Ereignisnamen in einer Datei definieren und diese sowohl in die Benachrichtigungsregistrierung als auch in das Senden aufnehmen. Zum Beispiel:

Headerdatei:

extern NSString * const NOTE_myEventName; 

Quelldatei:

NSString * const NOTE_myEventName = @"MyEventName"; 

Anmeldung:

[[NSNotificationCenter defaultCenter] 
addObserver:self 
    selector:@selector(handleMyEvent:) 
     name:NOTE_myEventName 
     object:nil]; 

Senden Mitteilung:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:NOTE_myEventName object:nil]; 
1

Ich reparierte erfolgreich meinen "NSNotification nicht gesendet werden, wenn postNotificationName: genannt" zum Absturz bringen.

Ich fand den echten Fehler im Benachrichtigungshandler.

Die postNotificationName und addObserver sind alle als erster Beitrag dieses Threads richtig.

+1

Was war das Problem mit dem Message-Handler? Und wie hast du es behoben? – Meet

11

Im Grunde geht es um die Reihenfolge der Ausführung. Wenn Sie postNotificationName vor addObserver ausgeführt haben, ist dies ein einfaches Problem.Verwenden von Haltepunkten und Schritt durch den Code :)

Ihr erster Haltepunkt sollte hier aufhören:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"ScanCompleted" object:nil]; 

Dann hier:

[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self]; 

Stellen Sie außerdem sicher, dass die Wähler auf einen Doppelpunkt hat. Weil es Methodensignatur sein wird:

- (void)updateView:(NSNotification *)notification; 
+0

Danke für die Erinnerung, dass 'postNotificationName' vor' addObserver' aufgerufen wird. Es hat mein Problem gelöst. –

5

Ich hatte das gleiche Problem. Der Grund dafür ist, dass ich removeObserver Methode bei

- (void)viewDidDisappear:(BOOL)animated{ 

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter removeObserver:self]; 

} 

So überprüfen, ob, wenn Sie angerufen hatte removeObserver vor postNotification genannt.

+1

Bitte verwenden Sie den Link [edit] (http://stackoverflow.com/posts/27315932/edit) unter Ihrer Antwort, um die Formatierung des Codes zu korrigieren. – nop77svk

+0

Das Gleiche passierte mir. Verpasste einen Code, der alle Beobachter entfernte, nachdem ich den Beobachter hinzugefügt hatte. Keine Überraschung, es hat nicht funktioniert. – AndyDunn

3

Ich hatte ein ähnliches Problem und mein Problem war aufgrund der Benachrichtigung in einem anderen Thread aufgerufen. Das hat mein Problem gelöst.

dispatch_async(dispatch_get_main_queue(),^{ 
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self]; 
}); 
+1

Danke! Es funktioniert für mich. – Raja

Verwandte Themen