【问题标题】:calling optional delegate methods调用可选委托方法
【发布时间】:2010-11-22 22:50:18
【问题描述】:

我为一个类创建了一个委托

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

现在我在我的游戏对象中调用了这个方法:

[self.delegate gameStarted];

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

我尝试了一些变体

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

但这对我不起作用。 任何想法如何使这个“真正”可选?

提前致谢

【问题讨论】:

    标签: iphone objective-c delegates optional


    【解决方案1】:

    从您的if 语句中省略否定:

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

    【讨论】:

    • 天哪:我首先使用这个 if 语句来提前返回,如果它没有响应,然后我只是为这个方法复制它。多么愚蠢的错误。谢谢
    • 请注意,您的委托必须符合 NSOBject: @protocol XXX 才能工作
    【解决方案2】:

    要快速完成此操作,我建议如下:

    @objc protocol MyDelegate {
    
    optional func optionalMethod()
    
    }
    
    class MyClass : MyDelegate {
    
    // optionalMethod() does not have to be declared
    
    }
    

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

    【讨论】:

      【解决方案3】:

      检查委托是否实现了可选方法然后调用它是一种常见的模式,我使用预处理器宏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 泄漏警告。作为一个预处理器宏,它的工作方式完全符合预期。

      【讨论】:

        猜你喜欢
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多