表达式不可分配,来自MKAnnotation类委托的坐标属性

时间:2013-03-01 16:07:10

标签: ios xcode compiler-errors mkannotation

我做了这个架构,以便更好地解释我的烦恼。

enter image description here

那么,我该怎么做才能解决它?谢谢=)

3 个答案:

答案 0 :(得分:4)

变化:

puntoXML.coordinate.latitude = [valor floatValue];

为:

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

longitude进行类似的更改。另请注意,您需要在if语句中添加大括号。

答案 1 :(得分:3)

CLLocationCoordinate2Dstruct,即值类型。它是通过值传递的,这是另一种说“复制”的方式。如果您指定其字段(例如经度),则只需修改副本; 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];
} ...

答案 2 :(得分:2)

问题是您要为CLLocationCoordinate2D分配纬度/经度。

puntoXML.coorinate会返回CLLocationCoordinate2D(副本),因此分配latitude将无效。

相反,您需要使用新的纬度和经度创建一个完整的CLLocationCoordinate2D并将其设置为一次。

编辑最好还为纬度/经度提供单独的属性,并为每个在coordinate实例变量中设置其值的自定义设置器。