0

我对 Objective C 比较陌生,需要一些数组帮助。

我有一个包含字典和 NSNumber 数组的 plist,稍后将添加更多数组。

NSMutableDictionary *mainArray = [[NSMutableDictionary alloc]initWithContentsOfFile:filePath];

NSArray *scoresArray = [mainArray objectForKey:@"scores"];

我需要从数组中检索所有值并将它们连接到我在界面生成器中设置的 10 个 UILabel。我已完成以下操作以将 NSNumber 转换为字符串。

NSNumber *numberOne = [scoresArray objectAtIndex:0];  
NSUInteger  intOne = [numberOne intValue];  
NSString *stringOne = [NSString stringWithFormat:@"%d",intOne];  
scoreLabel1.text = stringOne;

这似乎是一个非常冗长的方法,我必须重复以上 4 行十次才能检索所有数组值。我可以使用 for 循环遍历数组,并将所有值在输出处转换为字符串吗?

任何信息,将不胜感激。

4

2 回答 2

2
// create NSMutableArray* of score UILabel items, called "scoreLabels"
NSMutableArray *scoreLabels = [NSMutableArray arrayWithCapacity:10];
[scoreLabels addObject:scoreLabel1];
[scoreLabels addObject:scoreLabel2];
// ...

NSUInteger _index = 0;
for (NSNumber *_number in scoresArray) {
    UILabel *_label = [scoreLabels objectAtIndex:_index];
    _label.text = [NSString stringWithFormat:@"%d", [_number intValue]];
    _index++;
}

编辑

我不知道你为什么要评论_index++。我还没有测试过这段代码,所以也许我在某个地方遗漏了一些东西。但我看不出有什么问题_index++——这是增加计数器的一种非常标准的方法。

作为创建scoreLabels数组的替代方法,您确实可以检索tag视图控制器的子视图的属性(在这种情况下,您在 Interface Builder 中UILabel添加值的实例)。tag

假设该tag值是可预测的——例如,UILabelscoreLabel1到的每个scoreLabel10都标有tag等于_index我们在for循环中使用的值(0 到 9)的值——那么你可以UILabel直接引用:

// no need to create the NSMutableArray* scoreLabels here
NSUInteger _index = 0;
for (NSNumber *_number in scoresArray) {
    UILabel *_label = (UILabel *)[self.view viewWithTag:_index];
    _label.text = [NSString stringWithFormat:@"%d", [_number intValue]];
    _index++;
}

成功的关键是tag值必须是唯一的,UILabel并且必须是您可以引用的东西-viewWithTag:

上面的代码非常简单地假设tag值与值相同_index,但这不是必需的。(它还假设UILabel实例是视图控制器view属性的子视图,这取决于您在 Interface Builder 中设置界面的方式。)

有些人编写的函数将 1000 或其他整数相加,允许您将子视图类型分组在一起——UILabel实例得到 1000、1001 等,UIButton实例得到 2000、2001 等。

于 2010-01-05T22:34:13.383 回答
0

尝试使用字符串值...

scoreLabel1.text = [(NSNumber *)[scoresArray objectAtIndex:0] stringValue];
于 2010-01-05T22:33:05.310 回答