【问题标题】:Continuously Update Label Based on UISlider Value根据 UISlider 值不断更新标签
【发布时间】:2013-08-07 17:11:32
【问题描述】:

我目前有一系列 5 个 UISlider,它们不断更新各自的标签,以 hh:mm:ss 格式显示用户选择的值。我将每个滑块的属性设置为连续,并将它们的目标设置为滑块更改时(此示例仅适用于第一个滑块)。

    sliderOne.continuous=YES;
    [sliderOne addTarget:self action:@selector(sliderOneChanged:) forControlEvents:UIControlEventTouchUpInside];

每个滑块的单独标签都会完美地更新所选时间。但是,现在我需要更新所有这些滑块下方的另一个标签,该标签不断总结滑块的值。

同时,我还使用两个分段控制器对滑块的值进行了一些转换——一个英里/公里分段控制器和另一个分段控制器中的各种距离。每次转换都会产生以秒为单位的时间,然后将其转换回 hh:mm:ss 格式,并在用户从他们想要的段控制器中选择哪个组合时显示在最后一个标签中。我已经为此计算了所有数学,并且标签会在更改段时正确更新,但不会连续更新。

如何更新标签以在用户更改它们时连续显示每个 UISlider 的总和?

【问题讨论】:

    标签: ios objective-c uilabel uisegmentedcontrol uislider


    【解决方案1】:

    如需持续更新,请使用UIControlEventValueChanged 事件和continuous 属性

        sliderOne.continuous=YES;
        [sliderOne addTarget:self action:@selector(sliderOneChanged:) forControlEvents:UIControlEventValueChanged];
    

    【讨论】:

      【解决方案2】:

      使用 KVO 获取 UISlider 更改的通知并相应地更新 UI。您希望使用dispatch_async 包装 UI 更新以避免锁定界面。

      使用KVO-Notification-Manager 可以是这样的(viewDidLoad 或类似的):

      id token1 = [slider1 addKVOBlockForKeyPath:@"value" options:NSKeyValueObservingOptionNew handler:^(NSString *keyPath, id object, NSDictionary *change) {
          dispatch_async(dispatch_get_main_queue(), ^{
              whateverSliderNeedsUpdate.value = /* your calculation result */;
          });
      }];
      id token2 = [slider2 /* repeat for as many sliders as you want */];
      ...
      

      在某个时候移除观察者很重要。

      - (void)dealloc {
          [slider1 removeKVOBlockForToken:token1];
          [slider2 ...];
      }
      

      如果您喜欢冒险,可以尝试ReactiveCocoa

      【讨论】:

      • 研究一下,这似乎是最好的解决方案,因为我必须进行一些计算……尽管我还不太了解 KVO。
      【解决方案3】:

      您可以创建一个方法来完成所有数学运算并使用结果更新您的 UILabel。例如:

      - (void)updateSumLabel {
          // this is obviously very simple
          float num1 = [_sliderOne value];
          float num2 = [_sliderTwo value];
          float sum = num1 + num2;
      
          [_sumLabel setText:[NSString stringWithFormat:@"@f",sum]];
      }
      

      您可以从任何现有方法(例如 sliderOneChanged)调用 updateSumLabel。这可能是最简单的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多