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

Lin*_*ong 1 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];
Run Code Online (Sandbox Code Playgroud)

然后我想通过做这样的事情来改变newLabel.center

[labels objectAtIndex:1].center.x +=10;
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误"请求成员"中心"在一个不是结构或联盟的东西"
然后我尝试

    [labels objectAtIndex:1]->center.x +=10;
Run Code Online (Sandbox Code Playgroud)

然后这给了我另一个错误说struct objc_object没有名为'center'的成员

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

ben*_*ado 7

您收到此错误是因为返回类型objectAtIndex:简单id(可以是任何对象); NSArray是一个通用容器,当您从中检索对象时,无法知道它是什么类型.知道,因为你把对象放在里面,但是编译器不知道.

你写了:

[labels objectAtIndex:1].center.x +=10;
Run Code Online (Sandbox Code Playgroud)

这在技术上是正确的,但编译器无法键入检查它.这相当于写这个:

id object = [labels objectAtIndex:1];
object.center.x +=10;
Run Code Online (Sandbox Code Playgroud)

第二行是发生错误的地方:编译器知道object是一个Objective-C对象,但它不知道什么类,所以它不知道已定义了什么属性等等.所以它试图将其解析为一个结构字段成员访问,它不是,它失败了.

如果你改为写:

UILabel *label = [labels objectAtIndex:1];
label.center.x +=10;
Run Code Online (Sandbox Code Playgroud)

现在编译器知道它label是UILabel的一个实例,它知道属性定义,并且它可以生成正确的代码.

现在您遇到第二个问题,因为您正在更改结构中的值.上面的第二行是简写:

label.center.x = label.center.x + 10;
Run Code Online (Sandbox Code Playgroud)

这又是Objective-C方法调用的简写:

[label center].x = [label center].x + 10;
Run Code Online (Sandbox Code Playgroud)

因为中心点是CGPoint结构,所以必须立即获取/设置整个点值,不能只更新x或y成员.所以,你需要这样做:

UILabel *label = [labels objectAtIndex:1];
CGPoint c = label.center;
c.x += 10;
label.center = c;
Run Code Online (Sandbox Code Playgroud)

这将做你想要的.

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