2010-01-05 2 views
0

Я относительно новичок в Objective C и нуждаюсь в некоторой помощи массива.Извлечь NSNumber из массива

У меня есть plist, который содержит словарь и массив NSNumber, с дополнительными массивами до .

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

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

Мне нужно получить все значения из массива и подключить их к 10 UILabels который я настроил в интерфейсе строителя. Я сделал следующее, чтобы передать NSNumber в String.

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

Это кажется очень длинным извилистым подходом, мне пришлось бы повторить 4 строки выше десяти раз, чтобы получить все значения массива. Могу ли я использовать цикл for для итерации по массиву со всеми значениями, преобразованными в строки на выходе?

Любая информация была бы принята с благодарностью.

ответ

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++; 
} 

EDIT

Я не уверен, почему вы хотите, чтобы закомментировать _index++. Я не тестировал этот код, так что, возможно, я чего-то не хватает. Но я не вижу ничего плохого в _index++ - это довольно стандартный способ увеличить счетчик.

В качестве альтернативы созданию scoreLabels массива, вы могли бы действительно извлечь tag свойства подобозрения контроллера вида (в данном случае, UILabel экземпляров, которые вы добавляете значение tag в Interface Builder).

Предполагая, что значение tag предсказуема - например, каждый UILabel из scoreLabel1 через 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 и т. д.

+1

Вы даже можете избавиться от массива scoreLabels, если теги были добавлены в объекты UILabel в Interface Builder и viewWithTag: для их извлечения. – gerry3

+0

Спасибо, Алекс. Это происходит только в том случае, если я комментирую _index ++. Затем он возвращает окончательное число в массиве на метке, определенной в [scoreLabels addObject: scoreLabel1]; – user244295

+0

Получил эту работу, используя -viewWithTag, Cheers для информации. – user244295

0

попробовать с помощью stringValue ...

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

Спасибо, Джордж. Это прекрасно работает. Я хотел посмотреть, смогу ли я уменьшить количество линий. Используя вышеизложенное, по-прежнему потребуется 10 строк. оценкаLabel1.text = [(NSNumber *) [scoresArray objectAtIndex: 0] stringValue]; оценкаLabel2.text = [(NSNumber *) [scoresArray objectAtIndex: 1] stringValue]; ect ..... – user244295

+0

См. Ниже для краткого фрагмента кода. –

+0

О, я вижу, не понял, что вам нужно было повторить код для количества элементов в массиве. Просто подумал, что вам нужен один лайнер, чтобы установить текст UILabel из значения массива. Решение Алекса хорошее. – George