Как вызвать селектор в другом классе? - PullRequest
0 голосов
/ 11 декабря 2011

Я пытаюсь использовать этот код, но 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 ]

3 голосов
/ 11 декабря 2011

Проблема в том, что вы используете

addObserver:self

, что означает, что он ищет функцию в текущем классе.Вместо этого сделайте что-то вроде

addObserver:instanceOfOtherClass
2 голосов
/ 12 декабря 2011

Обновление
Добавьте вызов к методу 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 (init и dealloc это всего лишь примеры того, как я часто делаю это, не обязательно лучшее место в каждом примере, делайте то, что имеет смысл в вашем случае).

0 голосов
/ 12 декабря 2011

Проблема заключается в использовании вами addObserver: self

Наблюдатель должен быть классом экземпляра, содержащим метод, который вы хотите вызвать, поэтому сначала создайте его, а затем добавьте уведомление.Нечто подобное.

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

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