我有一個符合MKAnnotation協議的Map Point對象。它會按預期工作,直到我嘗試實時更改其座標。實時設置MKAnnotation座標
一開始我試圖用:
[map_point setCoordinate : new_coordinate];
它沒有工作,因爲屬性爲「只讀」。 Apple文檔說我應該添加一個自定義的「setCoordinate」,它需要符合KVO。
已閱讀有關KVO的文檔。希望有人能夠給出一個關於如何使setCoordinate KVO兼容的基本示例。
我有一個符合MKAnnotation協議的Map Point對象。它會按預期工作,直到我嘗試實時更改其座標。實時設置MKAnnotation座標
一開始我試圖用:
[map_point setCoordinate : new_coordinate];
它沒有工作,因爲屬性爲「只讀」。 Apple文檔說我應該添加一個自定義的「setCoordinate」,它需要符合KVO。
已閱讀有關KVO的文檔。希望有人能夠給出一個關於如何使setCoordinate KVO兼容的基本示例。
只需執行具有該確切格式的setCoordinate:
方法即可自動遵守KVO/KVC。你不需要做任何額外的東西:
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate
{
//In this example, the ivar in this class that holds the coordinate
//is named "coord". Simply assign the new value to it...
coord = newCoordinate;
}
使用命名完全一樣的(你可以改變參數名稱newCoordinate
雖然),KVO通知將自動爲您發出方法。
有關詳細信息,請參閱Do you need to call willChangeValueForKey: and didChangeValueForKey:?。
但是,如果您需要更改coordinate
在不符合標準的方法,你可以手動生成的志願通知:
- (void)someNonCompliantMethod
{
[self willChangeValueForKey:@"coordinate"];
coord = someNewCoordinate;
[self didChangeValueForKey:@"coordinate"];
}
注意,您可以完全避免實施setCoordiante:
方法(和伊娃)通過聲明coordinate
屬性作爲assign
或readwrite
代替readonly
手動簡單地:
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
//and @synthesize in the @implementation
現在,你不必編寫自定義的getter和setter方法,將能夠直接分配到coordinate
從這個實例化類的代碼:
[map_point setCoordinate : new_coordinate];
或:
map_point.coordinate = new_coordinate;
最後,如果您需要註釋的唯一屬性是title
,subtitle
和coordinate
,則還可以避免創建自定義類,並使用內置的MKPointAnnotation
類代替它,該類實現可寫入的coordinate
屬性。
感謝您的詳細解答。這非常有幫助。還有一個問題;當你說「someNonCompliantMethod」時,不符合的部分是否僅僅指其名稱不是「setCoordinate」? – Stanley
通常是的,但我發現有時NSObject仍然能夠自動處理KVO,這取決於類是如何編碼的。如果您發現沒有檢測到屬性更改,則可以自行添加通知。 – Anna
謝謝,非常好... – Stanley