Search code examples
iosobjective-cuilabeluisegmentedcontroluislider

Continuously Update Label Based on UISlider Value


I currently have a series of 5 UISliders that continuously update their respective labels to display what value the user is selecting in an hh:mm:ss format. I have the properties of each slider set to continuous and have their targets set to when the slider is changed (This example would be for just the first slider).

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

Each slider's individual label updates the time selected perfectly. Now however, I need to update another label underneath all of these sliders that continuously sums up the value of the sliders.

At the same time, I am also doing some conversions with the value of the slider using two segmented controllers -- a miles/kilometers segmented controller and various distances in another segmented controller. Each conversion results in a time in seconds that is then converted back into the hh:mm:ss format and displayed in the last label when the user selects which combo from the segment controller they want. I have all the math worked out for this, and the label will update correctly when changing segments, but not continuously.

How could I update a label to continuously show the sum of every UISlider as the user changes them?


Solution

  • Use KVO to get notified of changes in UISliders and update the UI accordingly. You want to wrap UI updates with dispatch_async to avoid locking the interface.

    Using KVO-Notification-Manager it can be something like this (in viewDidLoad or similar):

    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 */];
    ...
    

    It's important to remove the observers at some point.

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

    If you feel adventurous you can try with ReactiveCocoa.