NSNotificationCenter:不是自我的addObserver

时间:2014-09-27 22:41:22

标签: ios objective-c nsnotificationcenter

以下是问题:

在第二个视图加载之前,一个View Controller是否可以将另一个View Controller作为Observer添加到defaultCenter?

我有一个模型类,它创建一个NSURLSession,抓取一些数据,构建一个数组,并发送已完成的通知(以及指向数组的指针)。

我的应用加载了一个实例化模型的Map View,调用方法来创建数组,监听通知,并使用数组删除引脚。

我有一个表视图选项卡,我想使用地图构建的数组加载。

我的地图视图可以在加载表视图之前将我的表视图控制器添加为观察者吗?

类似的东西:

[[NSNotificationCenter defaultCenter] addObserver: TableViewController ...

感谢您的任何见解。我在走的时候正在弄清楚这一点。

----------------- EDIT --------------------

来自MapViewController的

viewDidLoad:

- (void)viewDidLoad
{
  [super viewDidLoad];
  _mapView.delegate = self;
  _model = [[WikiModel alloc] init];
  _lastArticleUpdateLocation = [[CLLocation alloc] initWithLatitude:0 longitude:0];
  _lastUpdateUserLocation    = [[CLLocation alloc] initWithLatitude:0 longitude:0];

  // Listen for WikiModel to release updates.
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(reloadData:)
                                               name:@"Array Complete"
                                             object:_model];

//table view listener attempt ...
UITableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"tableViewController"];

[[NSNotificationCenter defaultCenter] addObserver:tvc
                                         selector: @selector(updateDataSource:)
                                             name:@"Array Complete"
                                           object:nil];
[self.navigationController pushViewController:tvc animated:YES];

}

从TableViewController:

- (void)viewDidLoad
{
  [super viewDidLoad];

  // Listen for WikiModel to release updates.
    /*
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(updateDataSource:)
                                               name:@"Array Complete"
                                             object:nil];*/
}

-(void)updateDataSource:(NSNotification *)notification
{
  _wikiEntries = [[notification userInfo] objectForKey:@"wikiEntryArray"];
  [self.tableView reloadData];
    NSLog(@"************received***********");
}

1 个答案:

答案 0 :(得分:0)

只要您将指针作为观察者传递给视图控制器,就可以这样做。这是一个例子:

//Go to the detail view
VC2ViewController *dvc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC2ViewController"]; //ID specified in the storyboard
[[NSNotificationCenter defaultCenter] addObserver:dvc selector:@selector(notificationReceived:) name:@"MyNotification" object:nil];
[self.navigationController pushViewController:dvc animated:YES];

然后,您可以照常发布通知:

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

我刚刚测试了上面的代码,它对我来说运行正常,在我的详细视图控制器中调用了以下函数:

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

    NSLog(@"RECEIVED");
}