覆盖子类中的观察者方法

时间:2013-08-01 07:50:46

标签: iphone ios objective-c ipad

我坚持这个问题。 首先,我有一个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中删除观察者注册以防止多个观察者。

我还想知道如果注册已在父类中实现,如何删除子类中的观察者注册?

2 个答案:

答案 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]; 
}

这样两个类的代码都会运行,你必须注册一次观察者。