2011-07-07 51 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)]; 
    } 
}