Frage

Ich versuche, eine Instanz zu erhalten verwendet NSNotificationCenter mit addObserver und postNotificationName aber ich kann nicht herausfinden, warum es nicht funktioniert.

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

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

und

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

Wenn ich den Namen setzen Sie ihn auf nil funktioniert gut becuase es ist nur eine Sendung, wenn ich versuche, und definieren eine Benachrichtigung Namen die Nachrichten nie durch.

War es hilfreich?

Lösung

All mein Code nutzt NSNotifications etwa so:

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

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

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

Andere Tipps

Im Grunde ist es mit der Reihenfolge der Ausführung zu tun. Wenn Sie postNotificationName vor addObserver ausgeführt haben, dann ist dies ein einfaches Problem zu haben. 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];

Also, stellen Sie sicher, hat der Wähler einen Doppelpunkt auf. Weil es die Methode Signatur wird sein:

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

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

genannt
- (void)viewDidDisappear:(BOOL)animated{

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

   [notificationCenter removeObserver:self];

}

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

. Tipps: Sie können das Stichwort „removeObserver“ suchen, um zu finden, wenn Sie diese Funktion aufgerufen hatte

Ändern Sie diese:

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

folgt aus:

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

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

Ich hatte ein ähnliches Problem und mein Problem war aufgrund der Mitteilung auf einem anderen Thread aufgerufen wird. Dies löste mein Problem.

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

Haben Sie noch andere Namen versucht, aber @ „Ereignis“ und null? Nur um sicherzugehen, könnten Sie Ihre Ereignisnamen in einer Datei definieren und dass in beide Anmeldung Anmeldung und senden. Zum Beispiel:

Header-Datei:

extern NSString * const NOTE_myEventName;

Die Quelldatei:

NSString * const NOTE_myEventName = @"MyEventName";

Anmeldung:

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

Benachrichtigung zu senden:

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

ich erfolgreich fixierte mein „NSNotification nicht gesendet werden, wenn postNotificationName: genannt“ zum Absturz bringen.

Ich fand der wirkliche Fehler ist in Benachrichtigung Handler.

Die postNotificationName und addObserver ist alles in Ordnung als der erste Beitrag dieses Threads.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top