如何在不同的类中调用选择器?

时间:2011-12-11 19:37:40

标签: objective-c ios selector nsnotifications nsnotificationcenter

我正在尝试使用此代码,但Xcode返回错误,因为我试图在selector:@selector()中调用的方法在另一个类中。谢谢你的帮助!

AppDelegate.m:

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

MainViewController.m:

-(void)myMethodHere{
    [..]
}

3 个答案:

答案 0 :(得分:3)

问题是您使用

addObserver:self

表示它在当前类中查找该函数。而是做像

这样的事情
addObserver:instanceOfOtherClass

答案 1 :(得分:2)

<强>更新
将呼叫添加到init

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

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

  }
  return self;
}

请务必在dealloc

中删除自己
- (void)dealloc;
{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
  [super dealloc];
}

通过这种方式从对象进入存在的那一刻开始就可以接收通知,然后当它被解除分配时,它将安全地自行移除。


要遵循的一个好模式是让正在进行观察的类负责注册通知。这样可以很好地保持封装,并消除了向解除分配的实例发送通知的风险。

<强>原理
您需要平衡注册通知和取消注册通知的呼叫,否则可能会在解除分配的对象上调用消息,这可能很难追踪。

如果我有一个需要收到事件通知的课程,那么我将在init方法中注册通知,然后取消注册dealloc中的通知({{ 1}}和init只是我经常这样做的例子,不一定是每个例子中最好的地方,做你认为有意义的事情。)

答案 2 :(得分:0)

问题在于您的使用     的addObserver:自

观察者需要是一个包含要调用的方法的实例类,因此首先创建该方法,然后添加通知。像。的东西。

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

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