如何阻止不必要地双向传递值?

时间:2011-11-15 00:54:35

标签: iphone objective-c delegates

我正在制作一个颜色选择器。我有以下代码:

查看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值,该值将更改发送回滑块。不需要将其发送回滑块,如果用户正在移动滑块,它将跳回到原来的位置。有关如何以不同方式编码以阻止这种情况发生的任何建议吗?

注意:它实际上不是滑块,但是我把问题放在这个上下文中,因为它没有描述我所做的自定义控件那么复杂,类似于滑块。

1 个答案:

答案 0 :(得分:2)

添加一个额外的BOOL属性来控制它。将属性添加到视图控制器类;只要用户开始移动滑块,就可以翻转该值(可以在touchesBegan或实际移动滑块的任何方法中执行此操作)。该属性可以被称为任何东西,但想法是:

BOOL userIsAdjustingValue;

在您的一个类设置方法(init,viewDidLoad)中将其初始化为NO。当用户通过界面滑块触摸/开始修改值时,将其设置为YES。您可以通过另一个委托方法实现此目的,或者,假设您的滑块是子视图并且您的响应链完好无损,您可以直接使用touchesBegan在控制器中触发它,然后使用touchesEnded再次关闭。

在控制器中添加一条if语句,用于更新滑块值。如果userIsAdjusttingValue == YES,则不要让控制器更新它。

当用户完成操作滑块时,将值设置回NO,并且控制器可以自由地操纵滑块的值,因为它认为合适。