2010-11-22 28 views
12

he creado un delegado para una clasellamar a los métodos de delegado opcionales

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

ahora en mi juego de objetos i llama a este método:

[self.delegate gameStarted]; 

por lo que ahora, si inicio este objeto en cualquier lugar y establecer el delegar todo funciona bien hasta que se llame a gameStated, porque no está implementado en el objeto principal donde se crea el objeto del juego (porque es opcional).

He intentado algunas variaciones de este

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

pero esto no funciona para mí. alguna idea de cómo hacer esto "realmente" opcional?

gracias de antemano

Respuesta

18

omitir la negación de su declaración if:

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

oh Dios mío: D He utilizado esta sentencia if primero para un regreso temprano si no responde, y luego simplemente lo copié para este método. qué error tan estúpido. Gracias – choise

+1

tenga en cuenta que su delegado tendrá que conformarse con NSOBject: @protocol XXX para que esto funcione – BenB

0

Comprobación de si un delegado implementa un método opcional y luego llamando es un patrón común que utilizo un preprocesador macro SAFE_CALL que comprueba respondToSelector: y luego llama al método.

La macro es:

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

y se utiliza de esta manera:

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

Nota esta versión sólo funciona con métodos sin parámetros.

Originalmente se implementó como una función C, pero eso causa advertencias con performSelector fugas cuando se usa ARC. Como macro de preprocesador, funciona exactamente como se esperaba.

1

de lograr esto en Swift, recomiendo lo siguiente:

@objc protocol MyDelegate { 

optional func optionalMethod() 

} 

class MyClass : MyDelegate { 

// optionalMethod() does not have to be declared 

} 

Luego de llamar a la optional en el objeto delegate, un uso simple if delegate.optionalMethod?(){}

Cuestiones relacionadas