Постоянно обновлять метку на основе значения UISlider

В настоящее время у меня есть серия из 5 UISlider, которые постоянно обновляют свои соответствующие метки, чтобы отображать значение, которое выбирает пользователь, в формате чч: мм: сс. У меня есть свойства каждого ползунка, установленные как непрерывные, и их цели установлены при изменении ползунка (этот пример будет только для первого ползунка).

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

Индивидуальная метка каждого ползунка идеально обновляет выбранное время. Однако теперь мне нужно обновить еще одну метку под всеми этими ползунками, которая постоянно суммирует значение ползунков.

В то же время я также делаю некоторые преобразования со значением ползунка, используя два сегментированных контроллера — сегментированный контроллер миль/километров и различные расстояния в другом сегментированном контроллере. Каждое преобразование приводит к времени в секундах, которое затем преобразуется обратно в формат чч:мм:сс и отображается в последней метке, когда пользователь выбирает нужную комбинацию из контроллера сегмента. У меня для этого проработана вся математика, и метка будет корректно обновляться при смене сегментов, но не непрерывно.

Как я могу обновить метку, чтобы постоянно отображать сумму каждого UISlider по мере того, как пользователь их меняет?


person nniroclax    schedule 07.08.2013    source источник


Ответы (3)


arrow_upward
1
arrow_downward

Используйте KVO, чтобы получать уведомления об изменениях в UISliders и соответствующим образом обновлять пользовательский интерфейс. Вы хотите обернуть обновления пользовательского интерфейса с помощью 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.

person djromero    schedule 07.08.2013
comment
Глядя на это, это кажется лучшим решением, так как мне нужно сделать некоторые расчеты ... хотя я еще не совсем понимаю все KVO. - person nniroclax; 20.08.2013

arrow_upward
6
arrow_downward

Для непрерывного обновления используйте событие UIControlEventValueChanged вместе со свойством continuous.

    sliderOne.continuous=YES;
    [sliderOne addTarget:self action:@selector(sliderOneChanged:) forControlEvents:UIControlEventValueChanged];
person Bo A    schedule 07.08.2013

arrow_upward
0
arrow_downward

Вы можете создать метод, который выполняет всю вашу математику и обновляет ваш 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. Это, наверное, самый простой способ сделать это.

person Alex    schedule 07.08.2013