在故事板中使用NSNotification

时间:2012-10-23 11:09:44

标签: iphone objective-c ios

我正在尝试在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的详细信息,我们将不胜感激。

3 个答案:

答案 0 :(得分:3)

您应该在initWithNibNameawakeFromNib中添加观察者。故事板不会调用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。