AppDelegate中的NSNotification postNotificationName但ViewController中的NSNotificationCenter?

时间:2011-01-02 05:16:40

标签: objective-c cocoa nsnotificationcenter

我无法在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?

3 个答案:

答案 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时执行?

  1. didReceiveMessage未发布通知。假设您在问题中显示的代码是准确的,则情况并非如此。
  2. 视图控制器未观察到通知。由于它开始观察创造,也许还没有创建。或者,可能是因为你覆盖了init而不是NS / UIViewController的initWithNibName:bundle:。注意不同类的指定初始化程序是什么;文档通常会说。
  3. 视图控制器尚未观察到通知:您在视图控制器开始观察之前发布了通知(即,在创建视图控制器之前)。
  4. 您可能还希望将聊天文本作为通知的对象或其userInfo传递,而不是强制通知的所有观察者从未指定的来源检索它。

答案 1 :(得分:0)

+ defaultCenter是NSNotificationCenter上的一种类方法,无论您从何处调用它,它都会在给定进程中每次调用时返回相同的NSNotificationCenter实例。

如何定义'ChatMessageReceived'?它应该是一个NSString,但名称'ChatMessageReceived'是两个类上下文中的有效符号吗?

答案 2 :(得分:0)

看起来它应该可以工作,只要ChatMessageReceived的值在两个实例中都相同。

在使用didReceiveMessage发布通知之前,您是否使用调试器验证视图控制器文件中的init方法是否为