Как переопределить метод слушателя NSNotificationCenter суперкласса?

Скажем, у меня есть суперкласс, который слушает уведомление:

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


person Weichen Wang    schedule 01.10.2011    source источник
comment
Нет репро. Когда я настраиваю тестовую программу с описанной вами ситуацией, простое переопределение обработчика уведомлений в подклассе приводит к тому, что это вызывается, как я и ожидал.   -  person jscs    schedule 01.10.2011
comment
Увидев ваш ответ, я пересмотрел свой код и обнаружил нерелевантную ошибку, вызвавшую проблему. После этого оба вышеперечисленных метода работают нормально, NSNotificationCenter без проблем выясняет, что есть что. Спасибо за ответ!   -  person Weichen Wang    schedule 04.10.2011
comment
Рад слышать, что вы поняли это!   -  person jscs    schedule 04.10.2011


Ответы (2)


Будет ли это работать?

[[NSNotificationCenter defaultCenter] removeObserver: [собственный суперкласс] имя: @ "бар" объект: ноль];

person Zhang    schedule 01.10.2011
comment
[self superclass] будет объектом Class, а не экземпляром, верно? - person zoul; 01.10.2011
comment
Что ж, если у вас есть ссылка на экземпляр вашего суперкласса, вы можете использовать его в качестве параметра наблюдателя для метода removeObserver. - person Zhang; 02.10.2011

Закройте этот вопрос, ответив себе. В описании проблемы должно быть четко указано, как NSNotificationCenter работает с подклассами.

person Weichen Wang    schedule 27.06.2012