我可以从其他班级观看NSNotification吗?

时间:2011-08-18 20:11:43

标签: iphone objective-c ios nsnotifications nsnotificationcenter

我正试着绕过NSNotificationCenter。如果我的App代表中有这样的内容:

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

-(void)something:(NSNotification *) notification
{
  // do something

}

我可以在另一个视图控制器中以某种方式观察它吗?在我的情况下,我想在带有表的视图控制器中观察它,然后在收到通知时重新加载表。这可能吗?

5 个答案:

答案 0 :(得分:13)

是的,你可以这样做:

在A类中:发布通知

 [[NSNotificationCenter defaultCenter] postNotficationName:@"DataUpdated "object:self];

在B类中:首先注册通知,并编写一个方法来处理它。 您将相应的选择器提供给方法。

//view did load
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUpdatedData:) name:@"DataUpdated" object:nil];


-(void)handleUpdatedData:(NSNotification *)notification {
    NSLog(@"recieved");
}

答案 1 :(得分:4)

是的,你可以这就是NSNotification的全部目的,你只需要像你在App Delegate上那样添加你想要的观察者,它就会收到通知。< / p>

您可以在此处找到更多信息:Notification Programming

答案 2 :(得分:2)

当然有可能,这是通知的全部内容。使用addObserver:selector:name:object:是注册接收通知的方式(您应该在表视图控制器中执行此操作),并且可以使用postNotificationName:object:userInfo:发布来自任何类的通知。

阅读Notofication Programming Topics了解详情。

答案 3 :(得分:2)

您可以注册以在任意数量的课程中观察通知。你只需要“冲洗并重复”。包含在视图控制器中注册为观察者的代码(可能在viewWillAppear :)中,然后从您的方法重新加载tableView:

- (void)viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(something:) name:@"something" object:nil];
}

-(void)something:(NSNotification *) notification
{
  [self.tableView reloadData];
}

一旦不再需要通知,取消注册视图控制器也是个好主意:

- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

答案 4 :(得分:1)

如果您希望Observer在发布通知时表现不同,则应将其添加为selector并提供不同的viewController方法。

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


-(void)somethingOtherThing:(NSNotification *) notification
{
// do something

}