2013-03-01 52 views
4

我做了這個模式以更好地解釋我的麻煩。表達式不可分配,來自MKAnnotation類委託的座標屬性

enter image description here

所以,我能做些什麼來解決這個問題?謝謝=)

+0

看起來'puntoXML'是隻讀的。 – 2013-03-01 16:10:12

+0

什麼是'puntoXML'?什麼是'勇氣'? – trojanfoe 2013-03-01 16:10:59

+0

如圖所示:'puntoXML是MapAnnotation'類型並且是'(nonatomic,assign)',所以不是隻讀的,那麼'valor是來自解析器方法的字符串。 – rokimoki 2013-03-01 16:12:26

回答

3

CLLocationCoordinate2Dstruct,即值類型。它通過價值傳遞,這是另一種說「複製」的方式。如果你指定了它的字段(例如經度),那麼修改副本; Annotation內部的原始coordinate將保持不變。這就是爲什麼該財產不可轉讓。

爲了解決這個問題,你應該爲緯度和經度添加單獨的屬性,而是使用它們:

@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]; 
} ... 
+0

非常感謝,看來要工作100%至少沒有編譯器錯誤,我知道花括號,但它不需要是一個結構,對吧? – rokimoki 2013-03-01 16:33:50

+0

@rokimoki這實際上是一個語法錯誤,我現在修復。感謝您指出! – dasblinkenlight 2013-03-01 16:41:45

+0

這個想法/解決方案是你的,非常感謝。 – rokimoki 2013-03-01 16:45:00

4

變化:

puntoXML.coordinate.latitude = [valor floatValue]; 

到:

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

做了longitude了類似的變化。另請注意,您需要將大括號添加到if聲明中。

+0

好的答案,一旦我問類似的問題,並得到許多downvotes :) http://stackoverflow.com/questions/13952680/why-there-is-no-api-to-directly-update-xy-height-width 。但我仍然無法找到原因。恥辱!!! – 2013-03-01 16:23:59

+1

爲什麼我可以這樣做: 'CLLocationCoordinate2D initialLocation; initialLocation。緯度= lati; initialLocation.longitude = longi;' @AnoopVaidya有時候我會得到積分,今天是星期五,大家心情都很好 – rokimoki 2013-03-01 16:25:38

+0

@rokimoki是的,如果你願意,你可以設置經緯度。 – rmaddy 2013-03-01 16:27:55

2

的問題是,您正在爲您的經度/緯度分配CLLocationCoordinate2D的副本。

puntoXML.coorinate返回CLLocationCoordinate2D(副本),因此指定latitude將不起作用。

相反,您需要創建一個完整的CLLocationCoordinate2D與新的經度和緯度,並設置在一個地方。

EDIT更好依然爲緯度/經度提供單獨的性能,及對每個設置在coordinate實例變量它們的價值提供自定義設定器。