我有三个对象,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)];
}
}
我理解为什么它不起作用..但不知道如何解决它。
答案 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