【问题标题】:UISLider change UILabel's value the right wayUISLider 以正确的方式改变 UILabel 的值
【发布时间】: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];
}

一切正常,但我担心这里的代码质量。

这段代码相当长。有没有办法以某种方式优化它?谢谢!

【问题讨论】:

    标签: ios objective-c cocoa-touch uilabel uislider


    【解决方案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 个案例。

    【讨论】:

    • 另外,如果你想消除所有那些iffor-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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-20
          相关资源
          最近更新 更多