UISLider 以正确的方式改变 UILabel 的值
Posted
技术标签:
【中文标题】UISLider 以正确的方式改变 UILabel 的值【英文标题】:UISLider change UILabel's value the right way 【发布时间】:2013-04-03 12:56:45 【问题描述】:所以我有这段代码可以根据UISlider
的值更改UILabel
的值:
- (void)slider03Changed:(UISlider *)slider
int value = 10;
if (slider.value >= 0.1)
value = 20;
if (slider.value >= 0.2)
value = 30;
if (slider.value >= 0.3)
value = 40;
if (slider.value >= 0.4)
value = 50;
if (slider.value >= 0.5)
value = 60;
if (slider.value >= 0.6)
value = 70;
if (slider.value >= 0.7)
value = 80;
if (slider.value >= 0.8)
value = 90;
if (slider.value >= 0.9)
value = 100;
lbl01.text = [NSString stringWithFormat:@"%u hours", value];
一切正常,但我担心这里的代码质量。
这段代码相当长。有没有办法以某种方式优化它?谢谢!
【问题讨论】:
【参考方案1】:使用 for 循环:
- (void)slider03Changed:(UISlider *)slider
int value = 10;
for (float i = 0.9; i > 0; i-=0.1)
if (slider.value >= i)
value = (i*100)+10;
break;
lbl01.text = [NSString stringWithFormat:@"%u hours", value];
使用的公式是:
(i*100)+10
例如:
(0.6*100)+10 = 70
(0.7*100)+10 = 80
and so on...
更新:
您可以通过首先检查此案例slider.value >= 0.9
来进一步优化它。
为什么?
因为如果它满足更高价值的情况,那么您的if
语句的其余部分将毫无用处。在我编写的代码中,只要满足slider.value
的值最多的条件,我们就设置value
变量的值并跳出循环。这将阻止您的代码评估不必要的情况。
例如:
假设您的slider.value
= 0.95
这将在您的代码中发生:
(slider.value >= 0.1) ----> true ----> then ---> set value = 20
(slider.value >= 0.2) ----> true ----> then ---> set value = 30
(slider.value >= 0.3) ----> true ----> then ---> set value = 40
(slider.value >= 0.4) ----> true ----> then ---> set value = 50
(slider.value >= 0.5) ----> true ----> then ---> set value = 60
(slider.value >= 0.6) ----> true ----> then ---> set value = 70
(slider.value >= 0.7) ----> true ----> then ---> set value = 80
(slider.value >= 0.8) ----> true ----> then ---> set value = 90
(slider.value >= 0.9) ----> true ----> then ---> set value = 100
使用我的代码:
(slider.value >= 0.9) ----> true ----> then ---> set value = 100 and break out of the loop
如您所见,使用我的代码,它只评估 1 个案例。
【讨论】:
另外,如果你想消除所有那些if
和for-loop
,@Anoop Vaidya 的回答是一个很好的解决方案(也很有效)。【参考方案2】:
当您需要多个if
并且您知道只会执行一个时,请使用if-else ladder
。
在这种情况下,您可以使用 as:(这不是最好的方法)
if (slider.value >= 0.9)
value = 100;
else if (slider.value >= 0.8)
value = 90;
else ....
现在要自动化/制作更短的代码,您可以将其用作:
- (void)slider03Changed:(UISlider *)slider
lbl01.text = [NSString stringWithFormat:@"%.0f hours", round(value*10-.5)*10+10]);];
【讨论】:
【参考方案3】:像这样尝试一次,我认为这里不需要每次都使用循环,
- (void)slider03Changed:(UISlider *)slider
float value = slider.value;
int k=((int)(value*10)*10)+10;
if(k==110)
k=100;
lbl01.text = [NSString stringWithFormat:@"%d hours", value];
【讨论】:
【参考方案4】:首先,您可以考虑更改 UISlider 以使最小值和最大值与您想要的输出相匹配 - 即 min==0,max=99。如果您想在代码中执行此操作,这些将是 minimumValue 和 maximumValue 属性;如果您使用的是 Interface Builder,则这些将是 Attributes Inspector 中的 Minimum 和 Maximum 字段。
那么输出值的计算将是:
int value = slider.value;
value = (value + 10) - value % 10;
【讨论】:
以上是关于UISLider 以正确的方式改变 UILabel 的值的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中使用 UISlider 以编程方式更改 UILabel
使用 UISlider 更新 UILabel 会为 Sender 调用抛出“未解析的标识符”错误