导航控制器NSNotificationCenter addObserver被多次调用

时间:2015-02-28 08:20:52

标签: ios objective-c nsnotificationcenter

我有一个带有多个ViewControllers的标签栏应用程序,并将它们嵌入到一些导航控制器中。 我用谷歌搜索并尝试将观察者添加到第一个detailVC的viewDidLoad / viewWillAppear / viewDidAppear并删除相关viewWillDisappear / viewDidDisappear中的观察者  执行一个模型segue到我的第二个detailVC(也嵌入一个导航控制器),我点击一个名为postNotification的按钮然后关闭第二个detailVC自定义选择器函数调用它工作正常。如果我再次回到masterVC再次执行上述过程,则会调用该函数两次,依此类推。

BTW我在添加观察者时遵循此协议。

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"replyPosted" object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addNewComment:) name:@"replyPosted" object:nil];

点击按钮方法

[self dismissViewControllerAnimated:YES completion:nil];
NSDictionary *userinfo = @{@"reply_id":[result valueForKey:@"reply_id"],@"comment":comment};
[[NSNotificationCenter defaultCenter] postNotificationName:@"replyPosted" object:self userInfo:userinfo];

更新!

通过检查导航堆栈中的第一个DetailVC并在viewWillDisappear

中添加几行来解决问题
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    NSLog(@"%@",self.navigationController.viewControllers);
    //to check currentVC in navigation stack or not
    if([self.navigationController.viewControllers indexOfObject:self] == NSNotFound){
        NSLog(@"remove observer from viewWillDisappear");
        [[NSNotificationCenter defaultCenter] removeObserver:self name:@"replyPosted" object:nil];
    }   
}

chart

1 个答案:

答案 0 :(得分:0)

如果第一个detailVC在导航控制器堆栈中,则在viewWillDisappear中不执行任何操作,否则请删除观察者。