2012-11-15 10 views
6

Ich bin mir bewusst, der Standard Gründe, warum eine Benachrichtigung nicht empfangen werden:NSNotificationCenter Beobachter nicht Notification Empfangs

  • Aufheben der Zuordnung oder das registrierte Objekt zunichte gemacht.
  • Entfernen des Objekts als Beobachter.
  • Nicht als Beobachter registriert.
  • Registrierung für die falsche Benachrichtigung oder das Posten der falschen Benachrichtigung.

Ich kann glücklich sagen, dass ich verdammt sicher bin, dass keiner von diesen geschieht. Ich nehme an, dass das Objekt am wahrscheinlichsten annulliert und neu erstellt wird, aber es registriert sich bei der Initialisierung für die Benachrichtigung.

Hier ist, wo ich registrieren:

/** 
* initialises an object with a unique file url 
* 
* @param url       the url to set as the file url 
*/ 
- (id)initWithFileURL:(NSURL *)url 
{ 
    if (self = [super initWithFileURL:url]) 
    { 
     self.entries     = [[NSMutableArray alloc] init]; 

     // we want to be notified when a note has changed 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(noteChanged) 
                name:@"com.andbeyond.jamesvalaitis.notesChanged" 
                object:self]; 

     NSLog(@"Just registered for 'com.andbeyond.jamesvalaitis.notesChanged'"); 
    } 

    return self; 
} 

Hier ist, wo ich die Meldung schreiben:

/** 
* save the note content 
*/ 
- (void)saveNote 
{ 
    if (_isChanged) 
    { 
     // save to the text view to the note's contents 
     self.note.noteContent   = self.noteView.text; 

     // post a notification that we changed the notes 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"com.andbeyond.jamesvalaitis.notesChanged" object:nil]; 

     NSLog(@"Just posted 'com.andbeyond.jamesvalaitis.notesChanged'"); 

     // make sure we know it's already saved 
     _isChanged       = NO; 
    } 
} 

Dies ist die Methode, der nicht genannt wird: Das

/** 
* called when a note has changed 
*/ 
- (void)noteChanged:(NSNotification *)notification 
{ 
    NSLog(@"Just received for 'com.andbeyond.jamesvalaitis.notesChanged'"); 

    // save the notes 
    [self saveToURL:self.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) 
    { 
     if (success) 
      NSLog(@"Note updated."); 
    }]; 
} 

ist die Konsole, die klarstellt, dass ich sowohl die Meldung registriere und posten:

2012-11-15 13: 27: 50,958 iCloud Custom [11269: 907] Nur registrierte für

2012-11-15 13 'com.andbeyond.jamesvalaitis.notesChanged': 28: 24,184 iCloud Custom [11269: 907] geschrieben Gerade 'com.andbeyond.jamesvalaitis.notesChanged'

The whole project can be found here.

+1

Fügen Sie die notedChanged-Methode zum Beitrag hinzu ... – chrislhardin

+0

Ihr Selektor ist immer noch wie dieser @selector (noteChanged) .. dann wie nennt man das - (void) noteChanged: (NSNotification *) Benachrichtigung ??? Sie müssen Ihren Selektor wie folgt ändern @selector (noteChanged :) –

+0

@DineshRaja: Hallo Dinesh und James, ich stehe vor einem ähnlichen Problem und habe alle Antworten auf diesen Beitrag durchgelesen und die Vorschläge übernommen; die Dinge haben sich für mich nicht bewährt. Ich kann die Benachrichtigung erfolgreich posten und den Observer ebenfalls deklarieren. Aber die Logik, in der die Überprüfung durchgeführt wird, wird nicht ausgeführt. Wie soll ich den Code teilen? Oder sollte ich eine eher doppelte Frage posten? –

Antwort

19

Ich glaube, ich habe die Antwort herausgefunden. Sie erstellen die Benachrichtigung in UIDocument Datei mit dem Namen NotesDocument.m. Wenn Sie einen Beobachter erstellen, legen Sie das Objekt als self fest. Das bedeutet das NotesDocument-Objekt. Aber wenn Sie post the notification senden, senden Sie das Objekt als nil. So it wont observe the notification wie in der Dokumentation. Einfacher Weg, um dies zu überwinden, müssen Sie Objekt beim Erstellen einer Benachrichtigung als nil setzen. Andernfalls müssen Sie eine NotesDocument Object übergeben.

Schauen Sie sich die folgenden Bild- und Parameterdetails für die addObserver-Benachrichtigungsmethode an.

enter image description here

, sich den notificationSender Parameter.Das Objekt, dessen Benachrichtigungen der Beobachter empfangen möchte; Das heißt, Nur von diesem Absender gesendete Benachrichtigungen werden an den Beobachter geliefert.

+0

Was für ein Idiot ich gewesen bin. Ich wollte das Objekt nicht als selbst definieren, als ich mich für die Benachrichtigung registriert habe. Das funktioniert jetzt perfekt. Vielen Dank so verdammt viel. –

+0

Ich hatte genau das gleiche Problem und kann nicht glauben, dass ich die Antwort so schnell gefunden habe. Das ist so ein kleines Ding; so leicht zu übersehen und so schwer zu erkennen. Vielen Dank. – halfwaythru

+0

Ungefähr 20 Minuten, in denen ich dachte, ich hätte 'nil' als Objekt in dem Beobachter, und es war' self'. Vielen Dank für diesen Beitrag, um mich zu veranlassen, zu überprüfen, was ich erwartet habe, dass die rosafarbene Eigenschaft richtig ist. :) – kyleturner

0

Ändern Sie die folgenden Schritte aus:

... 
selector:@selector(noteChanged:) 

... 
- (void) noteChanged:(NSNotification *) notification 
... 
+0

Nur diese Änderung gemacht, und es hat nicht funktioniert. Trotzdem danke. –

+0

Verwenden Sie eine statische Zeichenfolge an beiden Stellen anstelle einer anderen Zeichenfolge für die Benachrichtigung. Sie scheinen genau gleich zu sein, aber es könnte etwas seltsam sein. – chrislhardin

Verwandte Themen