Iphone 如何更改存储在NSMutableArray中的UILabels的属性

Iphone 如何更改存储在NSMutableArray中的UILabels的属性,iphone,cocoa-touch,Iphone,Cocoa Touch,我将只向数组中添加一个UILabel作为示例 NSMutablearray *labels = [[NSMutableArray alloc] init]; UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(100,100,20,20)]; newLabel.center = CGPointMake(100, 100); [labels addObject:newLabel]; 然后,稍后我想通过这样做来更改newLab

我将只向数组中添加一个UILabel作为示例

NSMutablearray *labels = [[NSMutableArray alloc] init];
UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(100,100,20,20)];
newLabel.center = CGPointMake(100, 100);
[labels addObject:newLabel];
然后,稍后我想通过这样做来更改newLabel.center

[labels objectAtIndex:1].center.x +=10;
这给了我一个错误“请求非结构或联合中的成员“中心”
然后我试着

    [labels objectAtIndex:1]->center.x +=10;
然后这给了我另一个错误,说struct objc_对象没有名为“center”的成员


如何更改存储在NSMutableArray中的UILabel属性?

您会遇到此错误,因为
objectAtIndex:
的返回类型只是
id
(可以是任何对象);NSArray是一个通用容器,当您从中检索对象时,无法知道它是什么类型您知道,因为您将对象放入其中,但编译器不知道

你写道:

[labels objectAtIndex:1].center.x +=10;
这在技术上是正确的,但编译器无法对其进行类型检查。这相当于写下:

id object = [labels objectAtIndex:1];
object.center.x +=10;
第二行是错误发生的地方:编译器知道
object
是Objective-C对象,但它不知道是什么类,所以它不知道定义了什么属性,等等。因此它尝试将其解析为结构字段成员访问,但它不是,它失败了

如果你改写:

UILabel *label = [labels objectAtIndex:1];
label.center.x +=10;
现在编译器知道
label
是UILabel的一个实例,它知道属性定义,并且可以生成正确的代码

现在还有第二个问题,因为您正在更改结构中的值。上面第二行是以下内容的简写:

label.center.x = label.center.x + 10;
这也是Objective-C方法调用的简写:

[label center].x = [label center].x + 10;
因为中心点是一个CGPoint结构,所以必须一次获取/设置整个点值,不能只更新x或y成员。同样,你需要这样做:

UILabel *label = [labels objectAtIndex:1];
CGPoint c = label.center;
c.x += 10;
label.center = c;
那会做你想做的


如果你想说Objective-C是一种愚蠢的语言,因为你需要所有的临时变量。。。好吧,也许吧,但请公平地理解,您在一个示例中遇到了两个特殊情况。

您会遇到此错误,因为
objectAtIndex:
的返回类型只是
id
(可以是任何对象);NSArray是一个通用容器,当您从中检索对象时,无法知道它是什么类型您知道,因为您将对象放入其中,但编译器不知道

你写道:

[labels objectAtIndex:1].center.x +=10;
这在技术上是正确的,但编译器无法对其进行类型检查。这相当于写下:

id object = [labels objectAtIndex:1];
object.center.x +=10;
第二行是错误发生的地方:编译器知道
object
是Objective-C对象,但它不知道是什么类,所以它不知道定义了什么属性,等等。因此它尝试将其解析为结构字段成员访问,但它不是,它失败了

如果你改写:

UILabel *label = [labels objectAtIndex:1];
label.center.x +=10;
现在编译器知道
label
是UILabel的一个实例,它知道属性定义,并且可以生成正确的代码

现在还有第二个问题,因为您正在更改结构中的值。上面第二行是以下内容的简写:

label.center.x = label.center.x + 10;
这也是Objective-C方法调用的简写:

[label center].x = [label center].x + 10;
因为中心点是一个CGPoint结构,所以必须一次获取/设置整个点值,不能只更新x或y成员。同样,你需要这样做:

UILabel *label = [labels objectAtIndex:1];
CGPoint c = label.center;
c.x += 10;
label.center = c;
那会做你想做的


如果你想说Objective-C是一种愚蠢的语言,因为你需要所有的临时变量。。。好吧,也许吧,但是公平地说,你在一个例子中遇到了两种特殊情况。

一个nsarray是基于0的,所以它的第一个对象的索引是0,而不是1。一个nsarray是基于0的,所以它的第一个对象的索引是0,而不是1。另外,请注意数组中的第一个对象的索引是0,所以你应该说
[labels objectAtIndex:0]
。另外,请注意数组中的第一个对象的索引为0,因此您应该说
[labels objectAtIndex:0]