-4

我有一些变量,例如vh1 vh2 vh3等。是否可以在 for 循环中计算 i 变量?

我的意思是for(int i = 1; blablabla) { [[vh + i] setBackGroundColor blablabla];}

问候

编辑:vh1 等是 UILabel !!!

4

4 回答 4

3

虽然这可以通过自省来实现,但如果你有这样的变量,你最好将它们放在一个 NSArray 中,并使用索引访问它们。

于 2013-02-24T07:53:18.580 回答
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
}

文档中有更多关于 KVC 的内容。

为了完整起见,这种直接访问之所以有效,是因为一个标准的 KVC 兼容对象继承了一个名为accessInstanceVariablesDirectly. 如果您不想支持这种直接访问,那么您应该覆盖accessInstanceVariablesDirectly它以使其返回NO.

于 2013-02-24T09:49:49.403 回答
0

如果您UILabels 从 XIB加载,您可以使用IBOutletCollection.

申报财产:

@property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels;

现在您可以将 XIB 中的多个标签链接到此属性。然后在-viewDidLoad(加载 XIB 之后),您的数组被填充,您只需使用简单的for-in

for (UILabel *label in self.labels) {
    label.backgroundColor = ...
}
于 2013-02-24T08:26:47.217 回答
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];
}
于 2013-02-24T08:21:03.223 回答