0

我有这个代码:

if([annotation respondsToSelector:@selector(tag)]){
    disclosureButton.tag = [annotation tag];
}

我收到警告:

在协议中找不到“-tag”

int tag很公平,但是我已经使用具有合成变量的协议创建了一个新对象。

编辑:找到应用程序崩溃的原因 - 不是这一行。现在我只收到一个警告,该应用程序运行良好。

谢谢汤姆

4

1 回答 1

4

生成警告是因为对于 , 的静态类型,没有方法。正如您已经检查过动态类型是否响应选择器一样,在这种情况下您可以忽略警告。annotationMKAnnotation-tag

要摆脱警告:

  • 如果您期望某个类,则可以对其进行测试:

    if ([annotation isKindOfClass:[TCPlaceMark class]]) {
        disclosureButton.tag = [(TCPlaceMark *)annotation tag];
    }
    
  • 对于协议:

    if ([annotation conformsToProtocol:@protocol(PlaceProtocol)]) {
        disclosureButton.tag = [(id<PlaceProtocol>)annotation tag];
    }
    
  • 或者,如果两者都不适用,请使用特定协议来抑制警告(例如,对于快速更改的 Apple API 很有用):

    @protocol TaggedProtocol
    - (int)tag;
    @end
    
    // ...
    if([annotation respondsToSelector:@selector(tag)]){
        disclosureButton.tag = [(id<TaggedProtocol>)annotation tag];
    }
    
于 2010-09-09T10:08:55.573 回答