2

我正在尝试从其父类的实例中获取和设置属性。如果我只是简单地创建对象并立即获取或设置它们,它就可以工作,但是如果我将实例放在 NSArray 中,它会说找不到:

在“id”类型的对象上找不到属性“pos”

我有一个名为 Gameplay.m (UIViewController) 的视图控制器,我在 ViewDidLoad 方法中创建类 Wall (UIView) 的实例:

walls = [[NSMutableArray alloc] initWithCapacity:10];

for(int i = 0; i < 10; i++) {
    Wall *wall = [[Wall alloc] initWithFrame:CGRectMake(0, 0, 480, 320)];
    wall.opaque = NO;
    wall.backgroundColor = [UIColor clearColor];
    [wall setFrame:CGRectMake(levelpos.x + 200 * i, levelpos.y, 200, 200)];
    wall.pos = CGPointMake(levelpos.x + 200 * i, levelpos.y); //setting instance attribute works!
    [self.view addSubview:wall];
    wall.userInteractionEnabled = NO;
    [walls addObject:wall];
}

walls[0].pos = CGPointMake(0, 0); //Doesn't work!

Wall 类的属性 'pos' 在 Wall.h 中声明如下:

@interface Wall : UIView

@property (nonatomic, assign) CGPoint pos;

我在 Objective C 和 OOP 方面的经验都很少,一定有我遗漏的东西。

4

3 回答 3

2

数组下标返回类型id为 的对象,就编译器所知,这些对象是指向结构的指针。 id只有一个成员 ( isa),并且没有声明任何属性,因此尝试将其用作对象是编译时错误。只需将 Subscripting 的结果转换为您要发送消息的对象的类型。

((Wall *)walls[0]).pos = CGPointMake(0, 0); //Does work
于 2013-06-26T08:58:27.303 回答
1

当您编写时walls[0],您可以访问数组的一个对象,但您“不知道”它是什么。所以用((Wall*)walls[0]).pos

于 2013-06-26T08:56:59.740 回答
1

确保你已经进口

 #import "Wall.h"

和改变

walls[0].pos = CGPointMake(0, 0);

((Wall *)walls[0]).pos = CGPointMake(0, 0);
于 2013-06-26T08:57:27.613 回答