我有一个视图控制器" A"这是一个像这样的观察者注册,
-(void)viewWillAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"localActionTaken" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
}
我也在dealloc方法中移除了观察者。
来自视图控制器" A"用户去查看控制器" B"在哪里" localActionTaken"通知已发布。
一切正常,直到这个
现在我有另一个视图控制器" C"从哪个用户推送到控制器" A"并且来自" A"到" B"。 但问题出在这个" C" - >" A" - >" B",如果通知是在" B"观察者" A"会被通知两次!
如果我在这里遗失任何东西,请告诉我。
注意:我正在使用ECSlidingview和" A"和" C"是顶视图控制器。
-----------------更新-----------------
我必须根据对堆栈中特定视图控制器的检查,将removeObserver移动到viewWillDisappear。
答案 0 :(得分:1)
在A和B之间导航时,观察到的通知数量是否累积(增长超过两次)。当从A< - >移动时,viewWillAppear将继续被调用。 B但是dealloc还没有被调用。所以也许viewWillAppear中的removeObserver出现了错误,导致在A上添加了多个观察者,这将导致观察到多个通知。您包含的代码示例似乎适用于添加和删除以及在弹出回到C时的dealloc但我没有尝试使用“ECSlidingview”
答案 1 :(得分:0)
在viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
}
答案 2 :(得分:0)
您忘记了一件重要的事情,就是您需要在班上symmetric
。
如果您使用init
方法添加通知,则会在dealloc
方法中删除通知。
如果您使用viewWillAppear
方法添加通知,则会删除viewWillDisappear
方法中的通知(正如@Spetruk在评论中所述)。
所以,你可以这样做:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"localActionTaken" object:nil];
}