在 Objective C 中不使用 switch 语句显示评级图像的最佳实践
Best practice to display rating image without using switch statement in Objective C
我有一个 table 视图,其中有许多地方的评分是使用解析中的云代码计算的。我目前使用 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 个评分图像的最佳方法?
每当你看到这样的switch
,想想"array"。
创建一个 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];
这种方法的一个重要优点是图像只创建一次,并缓存在 class 实例上。这使您免于不必要的查找和对象构造。
注意:如果您想让代码正常工作,它不起作用的原因是您使用的是强制转换而不是调用 intValue
:
NSString *ratingImageName=[NSString stringWithFormat:@"%dStars.png",[ratings intValue]];
希望这段代码能在一行中解决问题。
[UIImage imageNamed:[NSString stringWithFormat:@"%dStars.png",rating]];
我有一个 table 视图,其中有许多地方的评分是使用解析中的云代码计算的。我目前使用 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 个评分图像的最佳方法?
每当你看到这样的switch
,想想"array"。
创建一个 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];
这种方法的一个重要优点是图像只创建一次,并缓存在 class 实例上。这使您免于不必要的查找和对象构造。
注意:如果您想让代码正常工作,它不起作用的原因是您使用的是强制转换而不是调用 intValue
:
NSString *ratingImageName=[NSString stringWithFormat:@"%dStars.png",[ratings intValue]];
希望这段代码能在一行中解决问题。 [UIImage imageNamed:[NSString stringWithFormat:@"%dStars.png",rating]];