Domanda

ho questo codice:

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

e ottengo l'avvertimento:

  

'- tag' non trovato nel protocollo

Fiera abbastanza, ma ho creato un nuovo oggetto con il protocollo che ha una variabile int tag sintetizzato.

EDIT: trovato il motivo per cui l'applicazione è stata crash - non questa linea. Ora ottengo solo un avvertimento e l'applicazione funziona bene.

Grazie Tom

È stato utile?

Soluzione

L'avviso viene generato perché per il tipo statico di annotation, MKAnnotation, non esiste un metodo -tag. Come già controllato montone castrato il tipo dinamico risponde al selettore è possibile ignorare l'avviso in questo caso.

Per sbarazzarsi del avvertimento:

  • Se ci si aspetta una certa classe è possibile testare per esso, invece:

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

    if ([annotation conformsToProtocol:@protocol(PlaceProtocol)]) {
        disclosureButton.tag = [(id<PlaceProtocol>)annotation tag];
    }
    
  • O se entrambi non si applicano utilizzare un protocollo specifico per eliminare l'avviso (utile per esempio con rapida evoluzione API di Apple):

    @protocol TaggedProtocol
    - (int)tag;
    @end
    
    // ...
    if([annotation respondsToSelector:@selector(tag)]){
        disclosureButton.tag = [(id<TaggedProtocol>)annotation tag];
    }
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top