KVO多个对象

时间:2011-07-07 00:46:12

标签: objective-c

我有三个对象,Alien,Balloon和Joystick,它们都有一个Location属性,我想从一个控制器中观察。

当控制器观察到任何对象的Location变量发生变化时,它会将相应视图的中心属性更新为模型的位置..

我的问题是当我使用以下功能时:

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

参数Object,类型为id,用于在我的MutableArray对象模型中搜索正确的索引,然后在我的MutableArray视图中使用相应的索引,我改变视图的中心.. < / p>

但是..因为参数是id类型,而不是(Balloon *),(Joystick *)或(Alien *),xcode会在下面的代码中抱怨Location不是object的成员:

- (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)];
    }
}

我理解为什么它不起作用..但不知道如何解决它。

2 个答案:

答案 0 :(得分:2)

点符号只能与静态类型变量一起使用,因为它需要知道要使用的setter方法(因为属性声明允许您选择自定义的setter名称)。在您的情况下,您可以使用正常的消息发送,因为您知道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)];
    }
}

答案 1 :(得分:1)

您需要将其强制转换为正确的类型。例如,而不是:

object.location

...使用:

((Balloon *)object).location