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的属性?
您收到此错误是因为返回类型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是一种愚蠢的语言,因为你需要所有的临时变量......好吧,也许,但是公平地理解你在一个例子中遇到了两个特殊情况.