Скажем, у меня есть суперкласс, который слушает уведомление:
@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 обрабатывает наблюдателей с одного и того же адреса, но с другим типом указателя. И я не хочу касаться суперкласса. Кто-нибудь может помочь?