基于UISlider值不断更新标签

时间:2013-08-07 17:11:32

标签: ios objective-c uilabel uisegmentedcontrol uislider

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

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

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

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

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

3 个答案:

答案 0 :(得分:5)

要进行持续更新,请使用UIControlEventValueChanged事件以及continuous属性

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

答案 1 :(得分:1)

使用KVO获取UISliders更改的通知并相应地更新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

答案 2 :(得分: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]];
}

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