2010-12-08 3 views
0

У меня есть селектор как свойство в моей структуре, которое является свойством, которое пользователь может установить.selector in Framework Вопрос

Вот свойство: @property SEL didBeginBackupSelector;

Так что в моем классе я синтезировать его и реализовать это следующим образом:

if (self.didBeginBackupSelector != nil) 
{ 
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:self.didBeginBackupSelector name:@"backupHasStarted" object:nil]; 
} 

Затем я скомпилировать рамки и ее реализации.

framework.didBeginBackupSelector = @selector(didBegin:); 

Но вместо того, чтобы вызвать селектор в своем классе, он пытается вызвать didBegin: в классе фреймворка.

Что мне не хватает?

+0

Где находится фрагмент кода? Если это метод класса, то self означает объект класса. Можете ли вы дать более подробную информацию о своей иерархии классов? – Costique 2010-12-08 20:50:09

ответ

0

В своем фрагменте кода вы ссылаетесь на self, что относится к вашему классу framework, а не к вызывающему. У вашей техники также есть другая проблема, которая заключается в том, что если файл didBeginBackupSelector изменится после регистрации для уведомления, он не будет вести себя так, как ожидалось. Я бы порекомендовал вам сделать что-то вроде следующего вместо:

В вашем .h:

@property (nonatomic) SEL didBeginBackupSelector; 
@property (nonatomic, assign) id didBeginBackupTarget; 

В вашем .m:

// where you first want to register 
// [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(backupHasStartedNotification:) name:@"backupHasStarted" object:nil]; 

// somewhere else in your file 
- (void)backupHasStartedNotification:(NSNotification *)notification { 
    if (self.didBeginBackupSelector) { 
     [self.didBeginBackupTarget performSelector:self.didBeginBackupSelector withObject:notification]; 
    } 
} 

Это будет работать, даже если изменение didBeginBackupSelector и didBeginBackupTarget после постановка на учет.