我有这个代码将sprite节点作为子节点添加到concreteGround
节点:
-(void) addObstaclesToNode:(NSString *)pattern
{
for(int index = 0; index<[self getPattern:pattern].arrayOfSprites.count; ++index)
{
id o = [[self getPattern:pattern].arrayOfSprites objectAtIndex:index];
o.position = CGPointMake(o.position.x + windowW, o.position.y);
[concreteGround addChild:[[self getPattern:pattern].arrayOfSprites objectAtIndex:index]];
}
}
(getPattern
是我创建的用于返回数组中对象的方法)无论如何,我希望变量o
接收[[self getPattern:pattern].arrayOfSprites objectAtIndex:index]
,但该代码可以返回各种类型的对象。我使用id
来执行此操作,但是当我尝试访问对象的属性时,Xcode告诉我“在id类型的对象上找不到该属性”。难道我做错了什么?谢谢你的帮助...
答案 0 :(得分:2)
致你的问:
Objective-C与声明的属性有很大的混乱。 (Lattner在那里?)
对于点表示法,即使它没有说明属性及其访问器的实现方式(合成或显式)和声明(@property或方法声明),编译器不接受任何已知属性,但只接受属性具有已知类型的对象。
你可以做两件事:
请勿使用点表示法进行访问。 (如果方法在任何地方声明,这是有效的。)
向下翻转对象。
BTW:你的代码不是很客观。您可以使用快速枚举和索引下标来使其更易读。
答案 1 :(得分:0)
是的,您需要确保o
是支持该选择器的类的实例,或者它支持选择器。
if ([o isKindOfClass:[YCYourClass class]]) {
YCYourClass *yourClass = o;
yourClass.position = ...
}
或者:
if ([o respondsToSelector:@selector(setPosition:)]) {
[o performSelector...
}
虽然现在我考虑过它,但您可能只是忘了在声明具有position
选择器的接口的地方包含标题......这也可能有用。