循环在IBOutlet类型的变量中

时间:2014-04-16 19:07:24

标签: ios objective-c uitextfield nsarray iteration

我有十二个文字字段,如下所示:

IBOutlet UITextField *ce_1;
IBOutlet UITextField *ce_2;
IBOutlet UITextField *ce_3;
....
IBOutlet UITextField *ce_12;

我所要做的就是在每个负责文本字段的变量中设置数组中的现有对象,我现在正在做如下:

ce_1.text = myArray[1];
ce_2.text = myArray[2];
ce_3.text = myArray[3];
....
ce_12.text = myArray[12];

不要写很多东西,我想我会在循环中以自动方式放置它,如下所示:

for(i=1;i<13;i++){
ce_[i].text = myArray[i];
}

但是这个命令不能按我预期的方式工作,所以我希望你的帮助能够解决我的想法并付诸实践,有没有办法做到这一点?

4 个答案:

答案 0 :(得分:1)

研究并开始使用IBOutletCollection。它将为您提供一系列文本字段,您可以在故事板XIB中构建它们。

请注意,您可能需要考虑数组的顺序,并且可能需要对其进行排序(可能基于每个视图的tag)。

从技术上讲,你可以使用字符串格式和KVC来做你目前正在尝试的事情,但这远非理想。

答案 1 :(得分:1)

你不能只用ce_ [i]替换ce_1 ce_2 ce_3它不会那样工作。您只能将[number]与nsarray变量(或后代)一起使用。

例如:

NSArray* myArray = @[@1];
NSLog(@"%@", myArray[0]);

您可能需要查看IBOutletCollection以获得类似于您所寻找的内容。

然而,与其他答案相反,IBOutletCollection按照您在界面构建器中链接它们的方式排序。

请参阅IBOutletCollections:How can I use IBOutletCollection to connect multiple UIImageViews to the same outlet?

答案 2 :(得分:0)

您可以使用IBOutletCollection。您还可以使用键值编码:

for(NSUInteger i = 0; i < 13; i++)
{
    [[self valueForKey:[NSString stringWithFormat:@"ce_%u", i]] setText: myArray[i]];
}

这会给你你想要的东西。

答案 3 :(得分:0)

我喜欢处理这些情况的方法是创建一个包含所有文本字段的临时数组:

NSArray *allFields = @[_ce_1, _ce_2, _ce_3, ...];
NSInteger i = 0;
for (UITextField *tf in allFields)
{
    tf.text = myArray[i];
    i++
}

IBOutletCollection也可以工作,但有时很难弄清楚当你回到你的项目时,哪个标签是#3或#5等......我发现这对我来说通常更好:)