Как я могу предотвратить ненужную передачу значений в обоих направлениях? - PullRequest
0 голосов
/ 15 ноября 2011

Я делаю палитру цветов. У меня есть следующий код:

Просмотр controller.h:

@interface ColorPickerViewController : UIViewController <HueSliderDelegate> {
    HueSlider *hueSlider;
    float hue;
}
@property (nonatomic, assign) float hue;

@end

Просмотр controller.m:

-(void)setHue:(float)hueLocal {
    hue = hueLocal;
    hueSlider.hue = self.hue;
}

-(void)hueChanged {
    self.hue = hueSlider.hue;
}

HueSlider.h:

@protocol HueSliderDelegate <NSObject>

-(void)hueChanged;

@end

@interface HueSlider : UISlider {
    HueSlider *hueSlider;
    float hue;
}    
@property (nonatomic, assign) float hue;

@end

HueSlider.m:

//the hue float can be set when the user moves the slider
-(void)setHue:(float)hueLocal {
    hue = hueLocal;
    slider.value = self.hue;
    [self.delegate hueChanged];
}

Проблема в том, что пользователь изменяет значение, ползунок отправляет изменение в контроллер представления. Контроллер представления затем меняет свое значение на оттенок, что возвращает изменение обратно к ползунку. Отправлять его обратно на ползунок не нужно, и если пользователь перемещает ползунок вперед, он вернется на прежнее место. Любой совет, как я могу кодировать это по-другому, чтобы не допустить этого?

Примечание. На самом деле это не слайдер, но я поставил проблему в этом контексте, поскольку он менее сложен, чем описание созданного мной пользовательского элемента управления, аналогичного слайдеру.

1 Ответ

2 голосов
/ 15 ноября 2011

Добавьте дополнительное свойство BOOL для управления этим.Добавьте свойство в ваш класс контроллера представления;переворачивайте значение всякий раз, когда пользователь начинает , чтобы переместить ползунок (это можно сделать в touchesBegan или любом другом методе, который фактически перемещает ползунок).Свойство может вызываться как угодно, но идея такова:

BOOL userIsAdjustingValue;

Инициализируйте его как NO в одном из ваших методов настройки класса (init, viewDidLoad).Когда ваш пользователь коснется / начнет изменять значение с помощью ползунка интерфейса, установите для него значение YES.Этого можно достичь с помощью другого метода делегата, или, если ваш слайдер является подпредставлением, а цепочка респондента не повреждена, вы, вероятно, можете запустить его в контроллере напрямую с помощью touchesBegan, а затем снова отключить с помощью touchesEnded.оператор if, окружающий вызов в вашем контроллере, который обновляет значение ползунка.Если userIsAdjusttingValue == YES, тогда не позволяйте контроллеру обновлять его.

Когда пользователь закончит манипулировать с ползунком, установите значение обратно на NO, и ваш контроллер сможет свободно манипулировать значением ползунка, как он сочтет нужным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...