Iphone 如何更改存储在NSMutableArray中的UILabels的属性
我将只向数组中添加一个UILabel作为示例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
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]
。