Search code examples
objective-coverridingselectorobserver-patternnsnotificationcenter

How to override superclass' s NSNotificationCenter listener method?


Say I have superclass which listens to a notification:

@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
}

Now in a subclass, I want to do something different with that notification. The first thing I tried is to override foo:

@implementation SubClass
- (void)foo:(NSNotification *)notification
{
  //do something different
}

This does not work since the listening selector still points to superclass's method. Then I tried to remove superclass's listener and add from subclass:

@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
}

This doesn't work either, with or without cast/override. The notification event is still handled by superclass. I'm not sure how NSNotificationCenter handles observers from same address but of different pointer type. And I don't want to touch superclass. Can anyone please help?


Solution

  • Close this question by answering myself. The problem description should have stated clearly how NSNotificationCenter works with subclasses.