2013-12-15 77 views
2

我有一個符合MKAnnotation協議的Map Point對象。它會按預期工作,直到我嘗試實時更改其座標。實時設置MKAnnotation座標

一開始我試圖用:

[map_point setCoordinate : new_coordinate]; 

它沒有工作,因爲屬性爲「只讀」。 Apple文檔說我應該添加一個自定義的「setCoordinate」,它需要符合KVO。

已閱讀有關KVO的文檔。希望有人能夠給出一個關於如何使setCoordinate KVO兼容的基本示例。

回答

4

只需執行具有該確切格式的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屬性作爲assignreadwrite代替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,subtitlecoordinate,則還可以避免創建自定義類,並使用內置的MKPointAnnotation類代替它,該類實現可寫入的coordinate屬性。

+0

感謝您的詳細解答。這非常有幫助。還有一個問題;當你說「someNonCompliantMethod」時,不符合的部分是否僅僅指其名稱不是「setCoordinate」? – Stanley

+0

通常是的,但我發現有時NSObject仍然能夠自動處理KVO,這取決於類是如何編碼的。如果您發現沒有檢測到屬性更改,則可以自行添加通知。 – Anna

+0

謝謝,非常好... – Stanley