2012-11-24 76 views
0

我一直试图让NSNotification工作。对于测试,我想要一个使用storyBoards加载新viewController的按钮。当你点击按钮时,它应该触发appObserver在第二个ViewController(我已经命名为Page2)中的通知。在Page2中,NSNotificationCenter应该启动一个方法(myMethod :)并打印出一个简单的NSLog。 不幸的是,它不起作用,因为myMethod没有被调用。我究竟做错了什么 ???NS通知不起作用

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (IBAction)goToPage2Button:(id)sender { 

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

} 

#import "Page2.h" 

@interface Page2() 

@end 


@implementation Page2 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(myMethod:) name:@"test" object:nil]; 


    } 
    return self; 
} 

-(void)myMethod:(NSNotification *)notification{ 


    if ([[notification name] isEqualToString:@"test"]) 
     NSLog (@"Successfully received the test notification!"); 


} 

回答

1

我想这可能是因为你的page2视图控制器在触发通知时不存在。

第二个视图控制器从它的笔尖中唤醒时注册观察,但如果它尚未创建,则它尚未注册第一个视图控制器正在发送的通知。

你应该做的是使用segues根据动作加载视图控制器。

+0

@Abizem - 感谢您让我走向正确的方向。我刚刚学会了如何使用segues传递数据,并且它工作得非常出色。 – pete

4

当您使用故事板时,通常不会调用initWithNibName。它使用initWithCoder。你确定你已经开始添加你的观察者吗?

如果您曾经看到某行代码没有被调用,那么将断点或NSLog放在一起并确认它是确实如此。

+0

好的,'awakeFromNib'也是一个可行的方法来定制。 – Abizern

+1

@Rob - 感谢罗布 - 你是对的。观察者在initWithNibName中根本没有被调用。目前,我通过使用Aabizems关于Segues的建议更改了我的应用程序。 – pete

+0

是的,如果使用故事板,'prepareForSegue'是将数据从一个segue的'sourceController'传递到'destinationController'的最好方法。如果你想从目标控制器传递东西回到源控制器,使用'delegate'或引用目的地的'presentViewController'是有道理的。但是,当使用多个视图控制器共享数据时(例如,您有一些异步后台作业,从远程服务器检索数据,并且想让任何视图控制器当前正在运行以使下载完成),“UINotificationCenter”是完美的。 – Rob