我有一些变量,例如vh1
vh2
vh3
等。
是否可以在for循环中使用i变量进行计数?
我的意思是for(int i = 1; blablabla) { [[vh + i] setBackGroundColor blablabla];}
此致
编辑:vh1等是UILabels !!!
答案 0 :(得分:3)
虽然这可以通过introspection实现,但如果你有这样的变量,最好把它们放在NSArray中,然后用索引访问它们。
答案 1 :(得分:1)
正如其他回答者所指出的那样,使用新的数组语法,您可以很容易地构建一个包含所有对象的数组,但即使您随后更改了原始ivars的值,它也会保留旧值。那可能是也可能不是你想要的。
如果您仍然坚持将变量保持为单个对象(而不是数组),那么您可以使用键值编码以编程方式访问它们。键值编码也称为KVC。
执行此操作的方法是valueForKey:
,可以在self
和其他对象上使用。
MyClass *obj = ... // A reference to the object whose variables you want to access
for (int i = 1; i <= 3; i++) {
NSString *varName = [NSString stringWithFormat: @"var%d", i];
// Instead of id, use the real type of your variables
id value = [obj valueForKey: varName];
// Do what you need with your value
}
docs中有更多关于KVC的内容。
为了完整性,这种直接访问的工作原因是因为标准的KVC兼容对象继承了一个名为accessInstanceVariablesDirectly
的类方法。如果您不想要支持此直接访问,那么您应该覆盖accessInstanceVariablesDirectly
,以便它返回NO
。
答案 2 :(得分:0)
您可以使用以下代码访问每个值。
UILabel *label1;
UILabel *label2;
UILabel *label3;
NSArray *array = @[label1, label2, label3];
for (int i = 0; i<3; i++) {
[array objectAtIndex:i];
}
可以为NSArray添加值以进行初始化。 如果您想稍后添加值,可以使用NSMutableArray。
我修改了我的代码。
UILabel *label1 = [[UILabel alloc] init];
UILabel *label2 = [[UILabel alloc] init];
UILabel *label3 = [[UILabel alloc] init];
NSArray *array = @[label1, label2, label3];
for (int i = 0; i<3; i++) {
UILabel *label = [array objectAtIndex:i];
label.frame = CGRectMake(0, i*100, 150, 80);
label.text = [NSString stringWithFormat:@"label%d", i];
[self.view addSubview:label];
}
答案 3 :(得分:0)
如果您要加载来自XIB的UILabels
,则可以使用IBOutletCollection
。
声明属性:
@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels;
现在,您可以将XIB中的多个标签链接到此属性。然后在-viewDidLoad
(加载XIB之后),您的数组已填充,您只需使用简单的for-in
:
for (UILabel *label in self.labels) {
label.backgroundColor = ...
}