我正在制作一个颜色选择器。我有以下代码:
查看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];
}
问题是用户更改了值,滑块将更改发送到视图控制器。视图控制器然后更改它的hue值,该值将更改发送回滑块。不需要将其发送回滑块,如果用户正在移动滑块,它将跳回到原来的位置。有关如何以不同方式编码以阻止这种情况发生的任何建议吗?
注意:它实际上不是滑块,但是我把问题放在这个上下文中,因为它没有描述我所做的自定义控件那么复杂,类似于滑块。
答案 0 :(得分:2)
添加一个额外的BOOL属性来控制它。将属性添加到视图控制器类;只要用户开始移动滑块,就可以翻转该值(可以在touchesBegan或实际移动滑块的任何方法中执行此操作)。该属性可以被称为任何东西,但想法是:
BOOL userIsAdjustingValue;
在您的一个类设置方法(init,viewDidLoad)中将其初始化为NO。当用户通过界面滑块触摸/开始修改值时,将其设置为YES。您可以通过另一个委托方法实现此目的,或者,假设您的滑块是子视图并且您的响应链完好无损,您可以直接使用touchesBegan在控制器中触发它,然后使用touchesEnded再次关闭。
在控制器中添加一条if语句,用于更新滑块值。如果userIsAdjusttingValue == YES,则不要让控制器更新它。
当用户完成操作滑块时,将值设置回NO,并且控制器可以自由地操纵滑块的值,因为它认为合适。