调用可选的委托方法

问题描述:

我创建了一个委托类调用可选的委托方法

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

现在在我的游戏对象我称这种方法:所以现在

[self.delegate gameStarted]; 

,如果我在任何地方启动该对象,并设置委托一切工作正常,直到gameStated被调用,因为它没有在创建游戏对象的主对象中实现(因为它的可选)。

我想这

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

一些改变,但是这不是为我工作。 任何想法如何使这个“真正”可选?

在此先感谢

if声明省略了否定:

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

哦,我的上帝:d我第一次使用这个if语句的如果它没有响应,则提早返回,然后我将其复制到此方法。多么愚蠢的错误。感谢 – choise 2010-11-23 09:34:51

检查如果委托实现了一个可选的方法,然后调用它是我用宏SAFE_CALL预处理器这样的通用模式检查respondToSelector:然后调用该方法。

宏:

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

,它是这样使用:

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

注意:此版本仅适用于不带参数的方法。

最初它是作为C函数实现的,但是在使用ARC时,会导致使用performSelector泄漏的警告。作为预处理器宏,它的工作原理与预期完全相同。

要迅速做到这一点,我提出以下建议:

@objc protocol MyDelegate { 

optional func optionalMethod() 

} 

class MyClass : MyDelegate { 

// optionalMethod() does not have to be declared 

} 

然后调用optionaldelegate对象,简单的使用if delegate.optionalMethod?(){}