nsnotification在AppDelegate中的注释名称,但在ViewController中nsnotificationcenter?
-
14-10-2019 - |
题
我无法在nsnotificationcenter中获得选择器方法,即receiveChattext执行,我想知道问题是否是因为NSnotification postnotificationName在appdelegate.m中,但nsnotificationcenter在viewController.m中?即,在注释后名称可以知道nsnotificationcenter在另一个ViewController文件中,还是我需要告诉的是?
在viewcontroller.m中我有
-(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");
}
在顶级AppDelegate.m文件中,我有以下内容:
-(void) didReceiveMessage {
[[NSNotificationCenter defaultCenter] postNotificationName:ChatMessageReceived
object:nil
userInfo:nil];
}
有什么想法可以阻止接收到didReceiveMessage时被执行?
解决方案
我无法获得选择器方法,receiveChatText,…
首先,是 receiveChatText:
, ,与结肠。这在Objective-C中很重要receiveChatText:
和 receiveChatText
不要指相同的方法。
其次,“选择器”并不意味着您认为这意味着什么。选择器是方法的名称。您将要发送通知中心发送给观察者的消息传递给选择器。也就是说,您正在告诉通知中心“当此通知到达时,请发送 receiveChatText:
给我的消息[视图控制器]”。
…在nsnotificationcenter中…
通知中心没有 receiveChatText:
方法。您的观察者(self
),这就是为什么您希望通知中心将消息发送到的原因。
…要执行,我想知道问题是否是因为NSnotification nsnotification nototificationname在appdelegate.m…
AppDelegate.m中没有这样的东西。
该应用程序委托发布通知。
…但是nsnotificationcenter在viewController.m中?
在viewController.m中没有这样的东西。
视图控制器观察通知。
只要视图控制器在应用程序委派发布通知之前将自己添加为观察者,这将起作用。如果它不起作用,则一项或两个步骤都不会发生,或者它们以错误的顺序发生。
即,在注释后名称可以知道nsnotificationcenter在另一个ViewController文件中,还是我需要告诉的是?
通知中心不在任何文件中。 [NSNotificationCenter defaultCenter]
是一个单身对象,在整个应用程序中共享的任何想要使用它的对象之间共享。这就是您能够使用它来使应用程序委派与视图控制器和任何其他观察到通知的对象进行通信的方式。
您正在发送默认通知中心 postNotificationName:object:userInfo:
信息。这是您以前应该发送的默认通知中心 addObserver:selector:name:object:
信息。只要您首先观察,然后将通知发送到同一通知中心,通知中心就可以向您添加的观察者发出通知。
任何可能停止接收的想法
receiveChatText:
从何时被称为何时被执行?
didReceiveMessage
没有发布通知。假设您在问题中显示的代码是准确的,事实并非如此。- 视图控制器没有观察到通知。由于它开始观察创建,因此也许还没有创建。或者,这可能是因为您已经覆盖了
init
而不是ns/uiviewController的initWithNibName:bundle:
. 。请注意哪些不同类的指定初始化器是什么;该文件通常会说。 - 视图控制器还没有观察到通知:您在视图控制器开始观察它之前发布了通知(即,在创建视图控制器之前)。
您可能还想将聊天文本作为通知的对象,或者在其中 userInfo
, ,而不是强迫所有观察者从未指定的来源中检索该通知。
其他提示
+DefaultCenter是NSnotificationCenter上的类方法,每次在给定的过程中调用它,无论您从哪里调用时,它将返回相同的NSNotificationCenter实例。
如何定义“ chatmessagereceed”?它应该是NSSTRING,但在您两个类的上下文中的“ ChatMessageReceived”这个名字是有效的符号吗?
只要价值 ChatMessageReceived
在这两种情况下都是一样的。
您是否使用调试器来验证 init
视图控制器文件中的方法被调用 前 该通知发布在Didreceivemessage中?