我正在尝试在Storyboard
中使用NSNotification。
当我不使用故事板时,此代码可以正常工作。
这是在ViewController1:
中- (IBAction) buttonClickedListener2:(id)sender {
[[NSNotificationCenter defaultCenter]
postNotificationName:@"TestNotification"
object:self];
}
这是在ViewController2中:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveTestNotification:)
name:@"TestNotification"
object:nil];
NSLog(@"initWithNib");
}
return self;
}
- (void) receiveTestNotification:(NSNotification *) notification
{
// [notification name] should always be @"TestNotification"
// unless you use this method for observation of other notifications
// as well.
if ([[notification name] isEqualToString:@"TestNotification"])
NSLog (@"Successfully received the test notification!");
}
代码有什么问题吗?正如我所说,我想让它在我的故事板中发挥作用。
如果您在STORYBOARD
中向我提供有关如何使用NSNotification的详细信息,我们将不胜感激。
答案 0 :(得分:3)
您应该在initWithNibName
但awakeFromNib
中添加观察者。故事板不会调用initWithNibName
。
例如:
- (void)awakeFromNib {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveTestNotification:)
name:@"TestNotification"
object:nil];
}
答案 1 :(得分:2)
故事板不使用initWithNibName
,因此您添加观察者的代码部分无法运行。您应该能够通过设置断点来看到这一点。修复将是替换
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self){
//statements
}
return self;
}
与
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self){
//statements
}
return self;
}
答案 2 :(得分:0)
代码看起来很好。
此问题可能是,您要从Notification
发布ViewController1
并将Notification
添加到ViewController2
。
检查在发布前是否已正确添加Notification
,当您尝试发布notification
时,可能未添加notification
。
另外一件事就是调试正确检查initWithNibName
是否被调用。
我认为storyboard不使用initWithNibName
所以你应该使用initWithCoder:(NSCoder *)aDecoder
而不是initWithNibName。