У меня есть табличное представление с рядом мест, рейтинг которых рассчитывается с использованием облачного кода при синтаксическом анализе. В настоящее время я использую оператор switch для отображения изображений в соответствии с полученным рейтингом. Вот мой текущий код.
[PFCloud callFunctionInBackground:@"calculateRating"
withParameters:@{@"place":cell.placeName.text}
block:^(NSNumber *ratings, NSError *error) {
if (!error) {
NSLog(@"%@ has %d starts",cell.placeName.text,[ratings intValue]);
rating = [ratings intValue];
switch(rating) {
case 1:
cell.ratingImage.image=[UIImage imageNamed:@"1Stars.png"];
break;
case 2:
cell.ratingImage.image=[UIImage imageNamed:@"2Stars.png"];
break;
case 3:
cell.ratingImage.image=[UIImage imageNamed:@"3Stars.png"];
break;
case 4:
cell.ratingImage.image=[UIImage imageNamed:@"4Stars.png"];
break;
case 5:
cell.ratingImage.image=[UIImage imageNamed:@"5Stars.png"];
break;
default:
break;
}
}
}];
Я попробовал следующий код для решения проблемы, но он не работает.
NSString *ratingImageName=[NSString stringWithFormat:@"%dStars.png",(int) ratings];
cell.ratingImage.image=[UIImage imageNamed:ratingImageName];
Я получаю следующую ошибку. - [NSNull intValue]: нераспознанный селектор отправлен в экземпляр 0x108572ce0
Может ли кто-нибудь помочь мне лучше всего отобразить 5 изображений с рейтингом, которые у меня есть в соответствии с полученным рейтингом?
2 ответа
Когда вы видите такой switch
, думайте о массиве.
Создайте NSArray
, предварительно заполните его изображениями таким образом, чтобы kStars.png
находился по индексу k
, и поместите его в переменную экземпляра:
_ratingImages = @[
[UIImage imageNamed:@"0Stars.png"]
, [UIImage imageNamed:@"1Stars.png"]
, [UIImage imageNamed:@"2Stars.png"]
, [UIImage imageNamed:@"3Stars.png"]
, [UIImage imageNamed:@"4Stars.png"]
, [UIImage imageNamed:@"5Stars.png"]
];
Теперь вы можете заменить переключатель на одно назначение:
cell.ratingImage.image=_ratingImages[rating];
Важным преимуществом этого подхода является то, что изображения создаются только один раз и кэшируются в экземпляре класса. Это избавляет вас от ненужных поисков и построения объектов.
Примечание. Если вы предпочитаете заставить свой код работать, причина, по которой он не работает, заключается в том, что вы используете приведение вместо вызова intValue
:
NSString *ratingImageName=[NSString stringWithFormat:@"%dStars.png",[ratings intValue]];
Надеюсь, этот код решит проблему в одной строке. [UIImage imageNamed: [NSString stringWithFormat: @ "% dStars.png", рейтинг]];
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.