Nsnotification postnotificationName in AppDelegate, aber nsnotificationCenter in ViewController?
-
14-10-2019 - |
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?
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?
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.- 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'sinitWithNibName:bundle:
. Seien Sie sich bewusst, was die ausgewiesenen Initialisierer verschiedener Klassen sind; Die Dokumentation wird normalerweise sagen. - 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?