2010-12-08 38 views
0

J'ai un sélecteur comme propriété dans mon framework, qui est une propriété que l'utilisateur peut définir.sélecteur dans le cadre Question

est ici la propriété: @property SEL didBeginBackupSelector;

Donc, dans ma classe, je synthétisent et mettre en œuvre comme ceci:

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

Je compilez le cadre et la mettre en oeuvre.

framework.didBeginBackupSelector = @selector(didBegin:); 

Mais au lieu d'appeler le sélecteur dans ma classe, il essaie d'appeler didBegin: dans la classe du cadre.

Qu'est-ce qui me manque?

+0

Où se trouve l'extrait de code? Si c'est dans une méthode de classe, self signifie l'objet de classe. Pouvez-vous donner plus de détails sur votre hiérarchie de classe? – Costique

+0

Etes-vous également responsable de la diffusion de cette notification? "backupHasStarted" est un nom terriblement générique pour une notification distribuée. –

+0

une de mes applications affiche la notification. – Pripyat

Répondre

0

Dans votre extrait de code, vous faites référence à self, qui fait référence à votre classe de structure, pas à l'appelant. Votre technique a également un autre problème, à savoir que si le didBeginBackupSelector change après vous être inscrit à la notification, il ne se comportera pas comme prévu. Je vous recommande de faire quelque chose comme ce qui suit à la place:

Dans votre .h:

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

Dans votre .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]; 
    } 
} 

Cela fonctionne même si le changement didBeginBackupSelector et didBeginBackupTarget après enregistrement.