Получить NSNumber из массива - PullRequest
0 голосов
/ 06 января 2010

Я относительно новичок в Objective C и мне нужна помощь с массивами.

У меня есть список, содержащий словарь и массив 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 ]

2 голосов
/ 06 января 2010
// 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 в интерфейсе 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 контроллера представления, которое будет зависеть от того, как вы настроили свой интерфейс в Интерфейсном Разработчике.)

Некоторые люди пишут функции, которые добавляют 1000 или другое целое число, которое позволяет группировать типы подпредставлений вместе - UILabel экземпляры получают 1000, 1001 и т. Д., А UIButton экземпляры получают 2000, 2001 и т. Д.

0 голосов
/ 06 января 2010

попробуйте использовать stringValue ...

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