L'expression n'est pas assignable, atsortingbut de coordonnée du délégué de class MKAnnotation

J'ai fait ce schéma afin d'expliquer mieux quels sont mes problèmes.

entrez la description de l'image ici

Alors, que puis-je faire pour le réparer? Merci =)

Le CLLocationCoordinate2D est une struct , c'est-à-dire un type de valeur. Il est transmis par la valeur, ce qui est une autre façon de dire "copyr". Si vous affectez ses champs (par exemple la longitude) tout ce qui ferait est de modifier une copy ; la coordinate originale à l'intérieur de votre Annotation restrait intacte. C'est pourquoi la propriété n'est pas assignable.

Pour résoudre ce problème, vous devez append des propriétés séparées pour la latitude et la longitude, et les utiliser à la place:

 @interface Annotation : NSObject<MKAnnotation> @property (readwrite) CLLocationDegrees latitude; @property (readwrite) CLLocationDegrees longitude; @property (nonatomic,assign) CLLocationCoordinate2D coordinate; ... @end @implementation Annotation -(CLLocationDegrees) latitude { return _coordinate.latitude; } -(void)setLatitude:(CLLocationDegrees)val { _coordinate.latitude = val; } -(CLLocationDegrees) longitude{ return _coordinate.longitude; } -(void)setLongitude:(CLLocationDegrees)val { _coordinate.longitude = val; } @end 

Maintenant, votre code d'parsingur XML peut le faire:

 if ([llave isEqualTo:@"lat"]) { puntoXML.latitude = [valor doubleValue]; } else if ([llave isEqualTo:@"lon"]) { puntoXML.longitude = [valor doubleValue]; } ... 

Changement:

 puntoXML.coordinate.latitude = [valor floatValue]; 

à:

 CLLocationCoordinate2D coord = puntoXML.coordinate; coord.latitude = [valor floatValue]; puntoXML.coordinate = coord; 

Apportez un changement similaire pour la longitude . Notez également que vous devrez append des accolades aux instructions if .

Le problème est que vous assignez une copy de CLLocationCoordinate2D avec votre latitude / longitude.

puntoXML.coorinate renvoie un CLLocationCoordinate2D (une copy) de sorte que l'atsortingbution de la latitude n'aura aucun effet.

Au lieu de cela, vous devez créer un CLLocationCoordinate2D complet avec les nouvelles latitude et longitude et définir cela en une fois.

EDIT mieux encore fournir des propriétés séparées pour la latitude / longitude et fournir un setter personnalisé pour chacun qui définit leur valeur dans la variable d'instance de coordinate .