我无法在NSNotificationCenter中执行选择器方法receiveChatText来执行,我想知道问题是因为NSNotification postNotificationName在AppDelegate.m中,但NSNotificationCenter在ViewController.m中? I.E. postNotificationName可以知道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?
答案 0 :(得分:1)
我无法获得选择器方法,receiveChatText,...
首先,它是receiveChatText:
,带有冒号。这在Objective-C中很重要 - receiveChatText:
和receiveChatText
并未引用相同的方法。
其次,“选择器”并不代表您认为的含义。选择器是方法的名称。您将选择器传递给希望通知中心发送给观察者的消息。也就是说,您告诉通知中心“当此通知到达时,向我发送receiveChatText:
消息[视图控制器]”。
...在NSNotificationCenter ......
通知中心没有receiveChatText:
方法。您的观察者(self
)会这样做,这就是您希望通知中心将消息发送到的原因。
...执行,我想知道问题是否是因为NSNotification postNotificationName在AppDelegate.m ...
AppDelegate.m中没有这样的东西。
应用代表发布通知。
...但NSNotificationCenter位于ViewController.m?
ViewController.m中没有这样的东西。
视图控制器会观察通知。
只要视图控制器在app委托发布通知之前将其自身添加为观察者,这将起作用。如果它不起作用,则不会发生一个或两个步骤,或者它们的顺序错误。
即。 postNotificationName可以知道NSNotificationCenter在另一个viewController文件中,还是我需要告诉它的?
通知中心不在任何一个文件中。 [NSNotificationCenter defaultCenter]
是一个单例对象,在整个应用程序中共享任何想要使用它的对象。这就是你如何使用它来让app委托与视图控制器和观察通知的任何其他对象进行通信。
您正在向默认通知中心发送postNotificationName:object:userInfo:
条消息。这是您之前应发送addObserver:selector:name:object:
消息的默认通知中心。只要您先开始观察,然后将通知发送到同一通知中心,通知中心就可以将通知发送给您添加的观察者。
什么想法可以阻止receiveChatText
receiveChatText:
在调用didReceiveMessage时执行?
didReceiveMessage
未发布通知。假设您在问题中显示的代码是准确的,则情况并非如此。init
而不是NS / UIViewController的initWithNibName:bundle:
。注意不同类的指定初始化程序是什么;文档通常会说。您可能还希望将聊天文本作为通知的对象或其userInfo
传递,而不是强制通知的所有观察者从未指定的来源检索它。
答案 1 :(得分:0)
+ defaultCenter是NSNotificationCenter上的一种类方法,无论您从何处调用它,它都会在给定进程中每次调用时返回相同的NSNotificationCenter实例。
如何定义'ChatMessageReceived'?它应该是一个NSString,但名称'ChatMessageReceived'是两个类上下文中的有效符号吗?
答案 2 :(得分:0)
看起来它应该可以工作,只要ChatMessageReceived
的值在两个实例中都相同。
在使用didReceiveMessage发布通知之前,您是否使用调试器验证视图控制器文件中的init
方法是否为?