Netnyke
Netnyke

Reputation: 151

How to call a selector in a different class?

I'm trying to use this code but Xcode returns an error because the method I'm trying to call in the selector:@selector() is in another class. Thanks for your help!

AppDelegate.m:

-(void)applicationDidBecomeActive:(UIApplication *)application{
 [..]
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethodHere) name:UIApplicationDidBecomeActiveNotification object:nil];
}

MainViewController.m:

-(void)myMethodHere{
    [..]
}

Upvotes: 0

Views: 2394

Answers (3)

Paul.s
Paul.s

Reputation: 38728

Update
Add the call to the init method of MainViewController

// MainViewController.m
- (id)init;
{
  self = [super init];
  if (self) {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod) name:UIApplicationDidBecomeActiveNotification object:nil];

  }
  return self;
}

Make sure to remove yourself in dealloc

- (void)dealloc;
{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
  [super dealloc];
}

By doing it this way from the very moment the object comes in to existence it is ready to receive notifications and then when it is being deallocated it will safely remove itself.


A good pattern to follow is to make the class that is doing the observing responsible for registering for notifications. This keeps encapsulation well and removes some risk of sending notification to deallocated instances.

Rationale
You need to balance your calls for registering for notifications and unregistering for notifications otherwise a message may be called on a deallocated object which could be hard to track down.

If I have a class that needs to be notified of an event the likely hood is I will register for the notifications in the init method and then unregister for the notifications in the dealloc (init and dealloc are just examples of times I often do this, not necessarily the best place in every example, do what makes sense in your case).

Upvotes: 2

AustinRathe
AustinRathe

Reputation: 681

The issue is your use of addObserver:self

The observer needs to be an instance class that contains the method you want to call, so create that first and then add the notification. Something like.

-(void)applicationDidBecomeActive:(UIApplication *)application{
[..]
SomeClass *newObject = [[SomeClass alloc] init];

    [[NSNotificationCenter defaultCenter] addObserver:newObject selector:@selector(someMethodContainedInSomeclass) name:UIApplicationDidBecomeActiveNotification object:nil];
}

Upvotes: 0

Accatyyc
Accatyyc

Reputation: 5828

The problem is that you use

addObserver:self

which means that it looks for the function in the current class. Instead do something like

addObserver:instanceOfOtherClass

Upvotes: 3

Related Questions