2010-01-05 69 views
0

我对Objective C比较新,需要一些数组帮助。从数组中检索NSNumber

我有一个plist,它包含一个字典和一个NSNumber数组,后面增加更多数组到 。

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

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

我需要从该数组检索所有的值,并将其连接到哪个 我在界面生成器中设置了10个UILabels。我已经完成了以下操作来将NSNumber强制转换为字符串。

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

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

任何信息将不胜感激。

使用stringValue的

回答

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值添加到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财产,子视图,这将取决于你如何设置你的界面在界面生成器。)

有人写加1000或一些其他的整数,可以让你组的功能类型的子视图在一起 - UILabel实例获得1000,1001等等,而UIButton实例将获得2000,2001等。

+1

如果将标签添加到Interface Builder中的UILabel对象并使用viewWithTag:来检索它们,您甚至可以摆脱scoreLabels数组。 – gerry3 2010-01-05 23:29:27

+0

谢谢亚历克斯。只有在注释掉_index ++时才会生成。然后它返回在[scoreLabels addObject:scoreLabel1]中定义的标签处数组中的最终Number; – user244295 2010-01-05 23:36:14

+0

使用-viewWithTag得到了这个工作,为信息干杯。 – user244295 2010-01-06 23:01:51

0

试...

scoreLabel1.text = [(NSNumber *)[scoresArray objectAtIndex:0] stringValue]; 
+0

感谢George。这工作正常。我想看看是否可以减少线路数量。使用上述内容仍然需要10行。 scoreLabel1。text = [(NSNumber *)[scoresArray objectAtIndex:0] stringValue]; scoreLabel2.text = [(NSNumber *)[scoresArray objectAtIndex:1] stringValue]; 等...... – user244295 2010-01-05 23:28:07

+0

请参阅下面的代码片段。 – 2010-01-06 00:18:24

+0

哦,我看到了,没有意识到问题是你需要重复数组中的项目数的代码。只是觉得你需要一个班轮来设置数组值的UILabel文本。 Alex的解决方案很好。 – George 2010-01-06 15:07:24