Скажем, у меня есть суперкласс, который слушает уведомление:
@implementation SuperClass
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(foo:) name:@"bar" object:nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"bar" object:nil];
}
- (void)foo:(NSNotification *)notification
{
//do something
}
Теперь в подклассе я хочу сделать что-то другое с этим уведомлением.Первое, что я попробовал, это переопределить foo:
@implementation SubClass
- (void)foo:(NSNotification *)notification
{
//do something different
}
Это не работает, так как селектор прослушивания все еще указывает на метод суперкласса.Затем я попытался удалить слушателя суперкласса и добавить из подкласса:
@implementation SubClass
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:(SuperClass *)self name:@"bar" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(foo2:) name:@"bar" object:nil];
}
- (void)foo2:(NSNotification *)notification
{
//do something different
}
Это не работает ни с, ни без приведения / переопределения.Событие уведомления все еще обрабатывается суперклассом.Я не уверен, как NSNotificationCenter обрабатывает наблюдателей с одного и того же адреса, но другого типа указателя.И я не хочу трогать суперкласс.Может кто-нибудь помочь, пожалуйста?