我有这个viewDidLoad
代码:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(messageReceived:)
name:@"messageReceived"
object:nil];
}
此视图控制器是UITabBarController
之一。每次我转到其标签时,viewDidLoad
都会被调用,但似乎[[NSNotificationCenter defaultCenter] removeObserver:self];
什么也没做," messageReceived"每次调用该方法时都会注册。
此另一个类的代码段通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"messageReceived"
object:nil
userInfo:nil];
只被调用一次,但是,例如,我去观察的视图控制器的选项卡3次,并且viewDidLoad
被调用3次,那么它的messageReceived:
方法也被调用3次......
我能错过什么?
答案 0 :(得分:0)
您可能想要挂钩以下内容:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(messageReceived:)
name:@"messageReceived"
object:nil];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
当您点击标签栏时,会创建一个新的UIViewController实例,因此会调用viewDidLoad
。当您从removeObserver
内调用viewDidLoad
方法时,您要求从观察者中删除新创建的视图控制器,此时此视图从未注册过。
-viewWillDisappear
,因此从该方法调用removeObserver
应该可以解决问题。
答案 1 :(得分:0)
我认为您应该在dealloc方法中添加“删除观察者”代码,当您的视图被删除时,它将被自动调用,用于后台处理,您可以发布来自app委托方法'applicationWillEnterInBackground'和其他方法的通知。