2011-07-07 86 views
1

我有三個對象,外星人,氣球和操縱桿,它們都具有位置屬性,我希望從一個控制器觀察。KVO多個對象

當控制器觀察到的任何物體的位置變量的變化,會立即更新相應的意見中心性能模型的位置..

我的問題是,當我使用下面的函數:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

參數Object類型爲id,用於在對象模型的MutableArray中搜索正確的索引,然後在視圖的MutableArray中使用相應的索引來更改視圖的中心。 。

但是..因爲參數是id類型的,而不是(氣球*),(Joystick *)或(Alien *),xcode抱怨Location不是以下代碼中的對象的成員:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    int index; 

    if ([keyPath isEqualToString:@"Location"]) 
    { 
     index = [balloons indexOfObjectIdenticalTo:object]; 

     [[balloonVs objectAtIndex:index] setCenter:CGPointMake(object.Location.x, object.Location.y)]; 
    } 
} 

我明白爲什麼它不能正常工作..但不知道如何修復它。

回答

1

您需要將其轉換爲正確的類型。例如,而不是:

object.location 

...用途:

((Balloon *)object).location 
+0

另一種方法是隻使用消息語法,即'[對象位置]',這將很好地工作,而不是需要強制。我想這只是一種風格偏好。 :) –

2

點標記只能通過靜態類型變量的使用,因爲它需要知道使用什麼setter方法(因爲財產申報讓你選擇一個自定義名字)。你的情況,你可以只用發送正常的消息,因爲你知道二傳手:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    int index; 

    if ([keyPath isEqualToString:@"Location"]) 
    { 
     index = [balloons indexOfObjectIdenticalTo:object]; 

     [[balloonVs objectAtIndex:index] setCenter:CGPointMake([object Location].x, [object Location].y)]; 
    } 
}