2010-05-18 6 views
0

J'ai créé une classe MKAnnotation personnalisée, MapLocation. Je n'ai aucun problème à définir ou obtenir des propriétés, sauf dans cette méthode pour créer un MKAnnotationView. Je dois le faire ici, car il est supposé rechercher un type d'emplacement à partir de l'index de l'annotation et sélectionner une famille d'annotations personnalisées pour l'annotationView. Après de nombreuses tentatives de configuration de getters et setters personnalisés dans MapLocation.h et .m, je l'ai ramené là où je ne peux même pas copier le getter, le titre (obligatoire), le renommer en title2, et essayer de obtenir sa valeur de retour. Ceci est mon code:Annotation personnalisée, 'Accès à la méthode getter inconnue'

-(MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation { 
static NSString *[email protected]"Map Location Identifier"; 
NSString *str1=annotation.title; 
NSString *str2=annotation.title2; 
if([annotation isKindOfClass:[MapLocation class]]) { 
    MKAnnotationView *annotationView=(MKAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:placemarkIdentifier]; 
    if (annotationView==nil) { 
     annotationView=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:placemarkIdentifier]; 
    } 
    else 
     annotationView.annotation=annotation; 


    return annotationView; 
} 
return nil; 

}

Sur la 4e ligne, le titre est retourné correctement, mais l'appel de la 5ème ligne à la méthode copiée donne le message d'erreur dans le sujet.

J'ai regardé dans les documents XCode, mais je n'arrive probablement pas à le déclarer, donc cette méthode le voit. Étrange qu'il voit le titre getter, mais pas la copie title2.

Répondre

3

Essayez de changer la ligne de la notation par points à ceci:

NSString *str2=[annotation title2]; 

et l'erreur devrait disparaître.

En l'occurrence, le compilateur a été informé que l'annotation est MKAnnotation. Le fait que vous sachiez quelles autres méthodes il a est irrelevent; le compilateur n'est pas psychique - tout ce qu'il sait c'est que l'annotation suit le protocole MKAnnotation, rien de plus. La raison pour laquelle il voit le titre getter est beacuse le titre est défini dans MKAnnotation.

Vous pouvez également résoudre ce problème en utilisant un casting:

MapLocation *mapLocation = (MapLocation *)annotation; 

Maintenant, vous pouvez dire

NSString *str2=mapLocation.title2; 

parce que vous avez dit au compilateur que mapLocation est un obejct de MapLocation.

+0

Je cherchais à déclarer un protocole MapLocation lorsque je vous ai vu répondre. Alors maintenant mes annotations ont des index qui les relie à tout ce dont j'ai besoin, et les images correctes pour le type d'emplacement sont montrées. Merci! Cela ne fonctionnait pas (j'avais déjà essayé): NSString * str2 = [annotation title2]; Il est dit -title2 est inconnu. Ne permet pas de le déclarer dans l'interface. Un peu étrange pour un débutant comme moi, "puisque le compilateur ne devrait pas s'inquiéter des messages, ils sont runtime". Je comprends maintenant qu'il se plaindrait de propriétés supplémentaires sans un casting, merci! –

Questions connexes