Pregunta

Tengo este código:

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

y me da la advertencia:

  

'- tag' no se encuentra en el protocolo

Muy bien, pero he creado un nuevo objeto con el protocolo que tiene una variable int tag sintetizado.

EDIT: encontrado la razón por la aplicación se estrellaba - No esta línea. Ahora acabo de recibir una advertencia y la aplicación funciona bien.

Gracias Tom

¿Fue útil?

Solución

La advertencia se genera debido a la tipo estático de annotation, MKAnnotation, no hay -tag método. Como ya marcó el carnero tipo dinámico responde al selector puede pasar por alto la advertencia en este caso.

Para deshacerse de la advertencia:

  • Si espera una cierta clase puede examinar para determinar su lugar:

    if ([annotation isKindOfClass:[TCPlaceMark class]]) {
        disclosureButton.tag = [(TCPlaceMark *)annotation tag];
    }
    
  • Para un protocolo:

    if ([annotation conformsToProtocol:@protocol(PlaceProtocol)]) {
        disclosureButton.tag = [(id<PlaceProtocol>)annotation tag];
    }
    
  • O si ambos no se aplican utilizar un protocolo específico para suprimir la advertencia (útil por ejemplo, con rápidos cambios de Apple API):

    @protocol TaggedProtocol
    - (int)tag;
    @end
    
    // ...
    if([annotation respondsToSelector:@selector(tag)]){
        disclosureButton.tag = [(id<TaggedProtocol>)annotation tag];
    }
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top