Nsnotification postnotificationName in AppDelegate, aber nsnotificationCenter in ViewController?

StackOverflow https://stackoverflow.com/questions/4577255

Frage

Ich kann die Selektormethode, den ReceivEchAttext, im NSNotificationCenter nicht ausführen, und ich frage mich, ob das Problem darin besteht, dass die NSNotification -PostnotificationName in AppDelegate.m ist, aber NsnotificationCenter ist in ViewController.m? IE Kennt der PostnotificationName wissen, dass sich das NSNotificationCenter in einer anderen ViewController -Datei befindet, oder muss ich es sagen?

In einer viewController.m habe ich

 -(id)init
 {
self = [super init];
if(self){
    [[NSNotificationCenter defaultCenter] addObserver:self  
                                      selector:@selector(receiveChatText:) 
                                                      name:ChatMessageReceived  
                                               object:nil];
 return self;
}

- (void)receiveChatText:(NSNotification *)note {
NSLog(@"received chat text");

}

und in der Top -Level -AppDelegate.m -Datei habe ich Folgendes:

 -(void) didReceiveMessage {
    [[NSNotificationCenter defaultCenter] postNotificationName:ChatMessageReceived 
                                          object:nil
                                          userInfo:nil];        
 }

Irgendwelche Ideen, was ReceivEchAttext davon abhalten könnte, ausgeführt zu werden, wenn didreceivemessage genannt wird?

War es hilfreich?

Lösung

Ich kann die Selektormethode, ReceivEchAttext,…

Erstens ist es receiveChatText:, mit dem Dickdarm. Dies ist wichtig für objektive C-receiveChatText: und receiveChatText Beziehen Sie sich nicht auf dieselbe Methode.

Zweitens bedeutet „Selektor“ nicht, was Sie denken, dass es bedeutet. Ein Selektor ist der Name einer Methode. Sie geben den Selektor für die Nachricht weiter, die das Benachrichtigungszentrum an den Beobachter senden soll. Das heißt, Sie sagen dem Benachrichtigungszentrum „Wenn diese Benachrichtigung eintrifft, senden Sie eine receiveChatText: Nachricht an mich [der Ansichtscontroller] “.

… Im NSNotificationCenter……

Das Benachrichtigungszentrum hat kein receiveChatText: Methode. Dein Beobachter (self) tut, deshalb soll das Benachrichtigungszentrum die Nachricht an die Nachricht senden.

… Um auszuführen, und ich frage mich, ob das Problem darin besteht, dass die NSNotification -PostnotificationName in AppDelegate.M… ist…

So etwas ist in AppDelegate.m.

Die App delegiert veröffentlicht eine Benachrichtigung.

… Aber nsnotificationCenter ist in ViewController.m?

So etwas ist im ViewController.m.

Der View Controller beobachtet eine Benachrichtigung.

Solange sich der Ansichtscontroller als Beobachter hinzufügt, bevor die App die Benachrichtigung delegiert, funktioniert dies. Wenn es nicht funktioniert, sind entweder ein oder beide Schritte nicht stattgefunden oder sie sind in der falschen Reihenfolge stattgefunden.

IE Kennt der PostnotificationName wissen, dass sich das NSNotificationCenter in einer anderen ViewController -Datei befindet, oder muss ich es sagen?

Das Benachrichtigungszentrum befindet sich nicht in beiden Dateien. [NSNotificationCenter defaultCenter] ist ein Singleton -Objekt, das während Ihrer gesamten Anwendung unter allen Objekten geteilt wird, die es verwenden möchten. Auf diese Weise können Sie es verwenden, damit der App -Delegierter dem View Controller und anderen Objekten, die die Benachrichtigung beobachten, kommunizieren.

Sie senden das Standardbenachrichtigungszentrum a postNotificationName:object:userInfo: Botschaft. Dies ist das gleiche Standard -Benachrichtigungszentrum, das Sie zuvor eins gesendet haben sollten addObserver:selector:name:object: Botschaft. Solange Sie zuerst beobachten, senden Sie die Benachrichtigung an das gleiche Benachrichtigungszentrum, das Benachrichtigungszentrum kann die Benachrichtigung an den von Ihnen hinzugefügten Beobachter versenden.

Alle Ideen, was ReceivEchAttext stoppen könnte

receiveChatText:

Von der Ausführung, wann didreceivemessage genannt wird?

  1. didReceiveMessage hat keine Benachrichtigung veröffentlicht. Unter der Annahme, dass der Code, den Sie in Ihrer Frage gezeigt haben, korrekt ist, ist dies nicht der Fall.
  2. Der View Controller beobachtet nicht die Benachrichtigung. Da es anfängt, die Schöpfung zu beobachten, wurde es vielleicht noch nicht geschaffen. Oder es kann daran liegen, dass Sie überschrieben haben init anstelle von NS/UIViewController's initWithNibName:bundle:. Seien Sie sich bewusst, was die ausgewiesenen Initialisierer verschiedener Klassen sind; Die Dokumentation wird normalerweise sagen.
  3. Der Ansichtscontroller beobachtet die Benachrichtigung noch nicht: Sie haben die Benachrichtigung veröffentlicht, bevor der Ansichtscontroller begann, sie zu beobachten (dh, bevor Sie den View Controller erstellt haben).

Möglicherweise möchten Sie den Chat -Text auch als Objekt der Benachrichtigung oder in seinem übergeben userInfo, anstatt alle Beobachter der Benachrichtigung zu zwingen, sie aus einer nicht näher bezeichneten Quelle abzurufen.

Andere Tipps

+StandardCenter ist eine Klassenmethode für NSNotificationCenter, die jedes Mal die gleiche NSNotificationCenter -Instanz zurückgibt, wenn sie in einem bestimmten Prozess aufgerufen wird, unabhängig davon, woher Sie sie aufrufen.

Wie wird "ChatMessagereceived" definiert? Es sollte ein NSString sein, aber ist der Name "ChatMessagereced" im Kontext Ihrer beiden Klassen ein gültiges Symbol?

Das sieht so aus, als ob es funktionieren sollte, solange der Wert von ChatMessageReceived ist in beiden Fällen gleich.

Haben Sie den Debugger verwendet, um zu überprüfen, ob die init Die Methode in der Ansichts -Controller -Datei wird aufgerufen Vor Die Benachrichtigung ist in didreceivemessage veröffentlicht?

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