Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: nniroclaxОтветов: 3

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

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

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

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

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

iosobjective-cuilabeluisegmentedcontroluislider

Ответы

Ответ 1 · рейтинг 1 · djromero

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

Ответ 2 · рейтинг 6 · Bo A

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

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

Ответ 3 · Alex

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы