我坚持这个问题。 首先,我有一个A类,即父类。 B类继承自A类。 在A类中,我为观察者添加了一些通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActiveFromBackground) name:UIApplicationDidBecomeActiveNotification object:nil];
我填写方法" appDidBecomeActiveFromBackground"用一些代码行。
在B类中,我想对这个处理方法进行更改,所以我重写了这个方法。但实际上,每次调用通知时都会调用类B中具有相同名称的方法,同时调用类A中的方法。
我怎么解决这个问题?
在B类方法中,我不会调用[super appDidBecomeActiveFromBackground];
因为我想要一个不同的实现。
编辑:来自下面的评论
- (void)appDidBecomeActiveFromBackground {
//-to be define
DEBUGLog(@"did become active");
WFFogSponsorVC *fogSponsorVC = [[[WFFogSponsorVC alloc] init] autorelease];
[self presentModalViewController:fogSponsorVC animated:NO];
}
我在父类(基类)的viewDidLoad方法中注册观察者,并在viewWillDisappear中删除观察者注册以防止多个观察者。
我还想知道如果注册已在父类中实现,如何删除子类中的观察者注册?
答案 0 :(得分:1)
当感兴趣的事件发生时,通知中心将通知自己注册的对象。在您的情况下,只有父类对UIApplicationDidBecomeActiveNotification
通知感兴趣,因为只有父类已注册为观察者而不是子类。所以当感兴趣的事件发生时,只会通知父类。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActiveFromBackground) name:UIApplicationDidBecomeActiveNotification object:nil];
在上面的通知中,注册代码addObserver:self
代表父类,而不是子类。
答案 1 :(得分:0)
尝试在B类中注册观察者。这样,每当应用程序变为活动状态时,都会调用它。
在你的B类appDidBecomeActiveFromBackground方法中你应该调用[super appDidBecomeActiveFromBackground]。
B类
- (void)appDidBecomeActiveFromBackground {
[super appDidBecomeActiveFromBackground];
//Do your another stuff here
}
A类
- (void)appDidBecomeActiveFromBackground {
//-to be define
DEBUGLog(@"did become active");
WFFogSponsorVC *fogSponsorVC = [[[WFFogSponsorVC alloc] init] autorelease];
[self presentModalViewController:fogSponsorVC animated:NO];
}
这样两个类的代码都会运行,你必须注册一次观察者。