2012-11-15 14 views
6

Jestem świadomy standardowych powodów, dla których zgłoszenie nie być odbierane:NSNotificationCenter obserwator nie wysyłaj powiadomień

  • dealokując albo uniemożliwienie zarejestrowanego obiektu.
  • Usuwanie obiektu jako obserwatora.
  • Niezarejestrowanie się jako obserwator.
  • Rejestracja w przypadku nieprawidłowego powiadomienia lub wysłania nieprawidłowego powiadomienia.

Mogę z radością powiedzieć, że jestem pewien, że nic takiego się nie dzieje. Przypuszczam, że najprawdopodobniej obiekt jest w pewnym momencie unieważniany i odtwarzany, ale rejestruje powiadomienie podczas inicjalizacji.

Tu zarejestrować:

/** 
* 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; 
} 

Oto gdzie mogę pisać zgłoszenia:

/** 
* 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; 
    } 
} 

Jest to metoda, która nie jest nazywany:

/** 
* 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."); 
    }]; 
} 

ten to konsola wyjaśniająca, że ​​zarówno rejestruję, jak i publikuję powiadomienie:

2012-11-15 13: 27: 50,958 iCloud klienta [11269: 907] Tylko zarejestrowany dla 'com.andbeyond.jamesvalaitis.notesChanged'

2012-11-15 13: 28: 24,184 iCloud niestandardowe [11269: 907] Podobnie pisał 'com.andbeyond.jamesvalaitis.notesChanged'

The whole project can be found here.

+1

Dodaj metodę noteChanged do wpisu ... – chrislhardin

+0

Twój selektor jest nadal podobny do tego @selector (noteChanged) .. jak to się to nazywa - (void) noteChanged: (NSNotification *) notification ??? musisz zmienić selektor, jak ten @selector (noteChanged :) –

+0

@DineshRaja: Cześć Dinesh i James, mam do czynienia z podobnym problemem i po przejściu wszystkich odpowiedzi na ten post, stosując sugestie; wciąż rzeczy mi się nie przydały. Jestem w stanie opublikować powiadomienie i zadeklarować także obserwatora. Ale logika, w której dokonuje się sprawdzenia, nie zostaje wykonana. Jak powinienem udostępnić kod? Czy powinienem wysłać raczej zduplikowane pytanie? –

Odpowiedz

19

Myślę, że zorientowali się odpowiedź. Tworzysz powiadomienie w pliku UIDocument o nazwie NotesDocument.m. Więc kiedy tworzysz obserwatora, ustawiasz obiekt jako self. To oznacza obiekt NotesDocument. Ale kiedy jesteś post the notification, wysyłasz obiekt jako nil. Tak więc it wont observe the notification zgodnie z dokumentacją. Łatwym sposobem na pokonanie tego problemu jest ustawienie obiektu jako nil podczas tworzenia powiadomienia. W przeciwnym razie musisz przekazać NotesDocument Object.

Zapoznaj się z poniższym obrazem i szczegółami parametrów dla metody powiadamiania addObserver.

enter image description here

Sprawdź parametr notificationSender.Obiekt, którego powiadomienia obserwator chce otrzymać; czyli tylko powiadomienia wysłane przez tego nadawcę są dostarczane do obserwatora.

+0

Jakim jestem idiotą. Całkowicie nie chciałem ustawić obiektu jako siebie, gdy zarejestrowałem się na powiadomienie. To działa teraz idealnie. Dziękuję bardzo cholernie. –

+0

Po prostu miałem dokładnie ten sam problem i nie mogę uwierzyć, że znalazłem odpowiedź tak szybko. To taka drobnostka; tak łatwe do przeoczenia i tak trudne do zauważenia. Dziękuję Ci bardzo. – halfwaythru

+0

Około 20 minut spędzonych na myśleniu, że miałem 'nil' jako obiekt w obserwatorze i było to' self'. Dziękuję za ten wpis, który skłonił mnie do sprawdzenia, czego oczekiwałem, aby obiekt w kolorze różowym był poprawny. :) – kyleturner

0

zmienić następujące:

... 
selector:@selector(noteChanged:) 

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

Po prostu wprowadzono tę zmianę i nie zadziałało. Mimo wszystko dziekuję. –

+0

Spróbuj użyć statycznego ciągu znaków w obu miejscach zamiast innego ciągu powiadomień. Wydają się być dokładnie takie same, ale może być coś dziwnego. – chrislhardin

Powiązane problemy