Получить NSNumber из массива
Я относительно новичок в 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 ответа
// 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
значение предсказуемо - например, каждый 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 и т. д.
Попробуйте использовать stringValue...
scoreLabel1.text = [(NSNumber *)[scoresArray objectAtIndex:0] stringValue];