在项目开发中,数据之间经常存在着联动现象。一个数据的变化就会引起其他数据相应的变化。比如在如下的颜色选择器中,输入不同的R、G、B值预览的颜色就会变化。实现起来通常会有几种方式:

1  在改变R、G、B值的同时手动改变预览颜色值。通常在非事件驱动的UI系统中使用。

2  注册R、G、B值对应控件的事件监听器,并在事件处理函数中进行预览颜色的更新。通常应用在事件驱动的UI系统中,比如MFC、WinForm等。

3  将R、G、B和预览颜色值进行绑定,一方的变化都会自动引发另一方的变化。这种技术是事件驱动的一种延伸。目前很多主流的UI系统都能够支持,比如QT、WPF等。

 

colorpicker2

    对于事件驱动和数据绑定之间的不同,可以参照如下的齿轮啮合图。事件驱动中每个齿轮都是隔开的,一个齿轮转动会通知一个处理过程,并有处理过程触发相关齿轮的转动。而数据绑定则好比啮合齿轮,一个转动会自动带动其他齿轮,无需人工干预或者其他处理机制。iOS的UI开发中是遵循事件驱动的,但没有提供数据绑定。不过由于支持了KVO(键值观察机制),实现数据绑定就相对比较自然和容易。github上的Binding库就提供了这样一个解决方案。

122er

 

 

基于Binding的代码片段如下:

- (void)viewDidLoad;
{
    [super viewDidLoad];
    [ILBinding bindingWithKeyPath:@"red"
                    ofSourceObject:self
                    boundToKeyPath:@"value"
                 ofTargetUIControl:self.redSlider
                           options:[ILBindingOptions optionsWithDefaultValues]];
     [ILBinding bindingWithKeyPath:@"green"
                    ofSourceObject:self
                    boundToKeyPath:@"value"
                 ofTargetUIControl:self.greenSlider
                           options:[ILBindingOptions optionsWithDefaultValues]];
     [ILBinding bindingWithKeyPath:@"blue"
                    ofSourceObject:self
                    boundToKeyPath:@"value"
                    ofTargetUIControl:self.blueSlider
                           options:[ILBindingOptions optionsWithDefaultValues]];
     ];
    [bindings addObject:
     [ILBinding bindingWithKeyPath:@"selectedColor"
                    ofSourceObject:self
                    boundToKeyPath:@"backgroundColor"
                 ofTargetObject:self.colorDisplayView
                           options:[ILBindingOptions optionsWithDefaultValues]]
     ];
    ……
}

 

实现起来很像啮合齿轮吧?是否有些小小心动呢?赶快下载试试吧~

 

项目链接:https://github.com/millenomi/Binding