1

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

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

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

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

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

4

3 回答 3

6

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

    sliderOne.continuous=YES;
    [sliderOne addTarget:self action:@selector(sliderOneChanged:) forControlEvents:UIControlEventValueChanged];
于 2013-08-07T17:43:20.133 回答
1

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

使用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

于 2013-08-07T17:45:41.220 回答
0

您可以创建一个方法来完成所有数学运算并使用结果更新您的 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。这可能是最简单的方法。

于 2013-08-07T17:33:58.360 回答