调用可选的委托方法
问题描述:
我创建了一个委托类调用可选的委托方法
@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)]) {
...
}
答
检查如果委托实现了一个可选的方法,然后调用它是我用宏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
}
然后调用optional
您delegate
对象,简单的使用if delegate.optionalMethod?(){}
哦,我的上帝:d我第一次使用这个if语句的如果它没有响应,则提早返回,然后我将其复制到此方法。多么愚蠢的错误。感谢 – choise 2010-11-23 09:34:51