2013-03-06 117 views
-1

我试图让NSNotifications工作。在这一刻,没有成功。NSNotification失败....为什么?

在我appDelegate.m文件我有:

[[NSNotificationCenter defaultCenter] postNotificationName:@"first" object:nil]; 

在我mainViewController.m,在viewDidLoad方法我有

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(firstRun)name:@"first" object:nil]; 

并建立了一个方法(在mainViewController.m以及):

-(void) firstRun:(NSNotification *) notification 
{ 
     NSLog(@"This works!"); 
} 

但是,运行应用程序时,在日志中没有看到任何输出。

我的代码有什么问题?请指教。

+0

Adri,如果您有时间,请点击下面答案旁边的复选标记,以便将此问题标记为已回答并被视为已关闭。 – 2013-04-09 21:23:34

+0

@Mike完成!谢谢你提醒我。 – A3O 2013-04-10 07:36:56

回答

1

上面的答案,其中指出,你曾使用过的观测方法的错误选择,肯定是有问题。

您应该检查的另一件事是您在发布通知之前添加观察者。通知是同步的。发布后,他们只会被已注册的观察员识别。

我建议您在发布通知的行上设置断点,并在添加观察者的行上设置断点,然后查看哪些行为先被命中。

+0

我不明白,请解释一下。我在哪里以及如何测试它?说我的ViewDidLoad必须在appDelegate.m中的applicationDidFinishLaunchingWithOptions之前在mainViewController.m中调用是否正确?这是正常的行为吗? – A3O 2013-03-06 14:42:52

+1

要测试它,您可以使用Xcode在模拟器中运行代码。如果您访问视图控制器的.view属性或在应用程序中调用[mainViewController视图]:didFinishLaunchingWithOptions:在发布通知之前,这会导致您的视图控制器调用viewDidLoad方法,然后再发布通知。 – 2013-03-06 14:43:50

+0

感谢您的回复。通过设置两个断点,我知道postNotification在观察者获取之前被“加载”。这不会工作(我认为) – A3O 2013-03-06 14:59:58

5

错误的选择,应该是:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(firstRun:)name:@"first" object:nil]; 
+0

编辑问题,它必须先运行。在我的问题中是错字。在我的代码中是正确的。没有改变 - >在NSLog中没有输出。 – A3O 2013-03-06 14:39:14

+1

@AdriOosterwijk你错过了这里的关键细节。您需要在firstRun之后添加冒号(:),比如'firstRun:',因为您有一个参数可以通过选择器。 – 2013-03-06 14:49:29

+0

@ 0x7ffffff和马克,我了解到,观察员必须在岗位调用之前加载。在​​我的情况下,它是相反的。我想我必须重做一些想法才能完成这一切。谢谢您的回复。 – A3O 2013-03-06 15:05:23