Как переопределить метод слушателя NSNotificationCenter суперкласса? - PullRequest
1 голос
/ 01 октября 2011

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

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

Ответы [ 2 ]

0 голосов
/ 27 июня 2012

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

0 голосов
/ 01 октября 2011

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

[[NSNotificationCenter defaultCenter] removeObserver: [self superclass] name: @ "bar" object: nil];

...