2010-11-22 21 views
12

i créé un délégué pour une classeappelant des méthodes de délégués en option

@protocol gameDelegate <NSObject> 
@optional 
-(void)gameStarted; 
@required 
@end 

maintenant dans mon objet de jeu j'ai appelé cette méthode:

[self.delegate gameStarted]; 

maintenant, si je lance cet objet partout et définissez les delegate tout fonctionne bien jusqu'à ce que gameStated soit appelé, car il n'est pas implémenté dans l'objet principal où l'objet de jeu est créé (car c'est optionnel).

J'ai essayé quelques variantes de ce

if(![self.delegate respondsToSelector: @selector(gameStarted)]) { 
    //[self.delegate gameStarted]; 
} 

mais cela ne fonctionne pas pour moi. des idées pour rendre ce "vraiment" facultatif?

merci à l'avance

Répondre

18

Omettre la négation de votre déclaration if:

if ([self.delegate respondsToSelector:@selector(gameStarted)]) { 
    ... 
} 
+0

oh mon dieu: D J'ai utilisé cette instruction if première pour un retour anticipé s'il ne répond pas, et je l'ai juste copié pour cette méthode. Quelle erreur stupide. merci – choise

+1

notez que votre délégué devra se conformer à NSOBject: @protocol XXX pour que cela fonctionne – BenB

0

Vérifier si un délégué met en œuvre une méthode facultative puis l'appeler est un modèle commun que j'utilise un préprocesseur macro SAFE_CALL cela vérifie respondToSelector: puis appelle la méthode.

La macro est:

#define SAFE_CALL(obj,method) \ 
([obj respondsToSelector:@selector(method)] ? [obj method] : nil) 

et il est utilisé comme ceci:

SAFE_CALL(sourceDelegate, refresh) 
// or 
NSString *response = SAFE_CALL(object, responseValue) 

Notez cette version ne fonctionne qu'avec des méthodes sans paramètres.

Initialement, il a été implémenté en tant que fonction C, mais cela provoque des avertissements avec des fuites performSelector lors de l'utilisation d'ARC. En tant que macro de préprocesseur, elle fonctionne exactement comme prévu.

1

Pour ce faire dans rapide, je recommande ce qui suit:

@objc protocol MyDelegate { 

optional func optionalMethod() 

} 

class MyClass : MyDelegate { 

// optionalMethod() does not have to be declared 

} 

ensuite appeler la optional sur votre objet delegate, simple utilisation if delegate.optionalMethod?(){}