В настоящее время у меня есть серия из 5 UISlider, которые постоянно обновляют свои соответствующие метки, чтобы отображать значение, которое выбирает пользователь, в формате чч: мм: сс. У меня есть свойства каждого ползунка, установленные как непрерывные, и их цели установлены при изменении ползунка (этот пример будет только для первого ползунка).
sliderOne.continuous=YES;
[sliderOne addTarget:self action:@selector(sliderOneChanged:) forControlEvents:UIControlEventTouchUpInside];
Индивидуальная метка каждого ползунка идеально обновляет выбранное время. Однако теперь мне нужно обновить еще одну метку под всеми этими ползунками, которая постоянно суммирует значение ползунков.
В то же время я также делаю некоторые преобразования со значением ползунка, используя два сегментированных контроллера - сегментированный контроллер миль/километров и различные расстояния в другом сегментированном контроллере. Каждое преобразование приводит к времени в секундах, которое затем преобразуется обратно в формат чч:мм:сс и отображается в последней метке, когда пользователь выбирает нужную комбинацию из контроллера сегмента. У меня для этого проработана вся математика, и метка будет корректно обновляться при смене сегментов, но не непрерывно.
Как я могу обновить метку, чтобы постоянно отображать сумму каждого UISlider по мере того, как пользователь их меняет?
Ответ 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.
Ответ 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. Это, наверное, самый простой способ сделать это.