我做了这个模式是为了更好地解释我的麻烦。
那么,我能做些什么来解决它呢?谢谢你=)
改变:
puntoXML.coordinate.latitude = [valor floatValue];
到:
CLLocationCoordinate2D coord = puntoXML.coordinate;
coord.latitude = [valor floatValue];
puntoXML.coordinate = coord;
对longitude
. 另请注意,您需要在if
语句中添加花括号。
是CLLocationCoordinate2D
一个struct
,即一个值类型。它是按值传递的,这是“复制”的另一种说法。如果您分配其字段(例如经度),那么所有要做的就是修改副本;coordinate
你里面的原件Annotation
会保持原样。这就是为什么该财产不可转让的原因。
要解决此问题,您应该为纬度和经度添加单独的属性,并改为使用它们:
@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
现在您的 XML 解析器代码可以执行此操作:
if ([llave isEqualTo:@"lat"]) {
puntoXML.latitude = [valor doubleValue];
} else if ([llave isEqualTo:@"lon"]) {
puntoXML.longitude = [valor doubleValue];
} ...
问题是您正在分配CLLocationCoordinate2D
带有纬度/经度的副本。
puntoXML.coorinate
返回一个CLLocationCoordinate2D
(副本),因此分配latitude
将无效。
相反,您需要CLLocationCoordinate2D
使用新的纬度和经度创建一个完整的并一次性设置。
编辑最好仍然为纬度/经度提供单独的属性,并为每个在coordinate
实例变量中设置其值的自定义设置器。