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

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

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

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

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

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


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


Ответы (3)


Используйте 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

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

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

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