SKBindingManager 1.0.0

SKBindingManager 1.0.0

测试已测试
语言语言 Obj-CObjective C
许可 自定义
发布最后发布2014 年 12 月

匿名用户 维护。



  • Slavko Krucaj

SKBindingManager - 针对iOS的轻量级绑定

SKBindingManager 是一个组件,允许您轻松将绑定添加到代码中,支持自动引用计数(ARC)。

它的设计使得您可以将两个对象或 UIView 或这两个对象的任何其他组合进行绑定。该组件的基本目的是在模型和视图之间启用绑定,而无需编写大量不必要的代码来处理所有这些。

SKBindingManager 允许您动态添加或移除绑定。您可以指定是一对一键绑定还是双向绑定。它对绑定中的循环检测提供内置支持。例如,如果您有一个具有属性 `a`、`b` 和 `c` 的对象 `A`>`,则不允许您进行如下这样的绑定 `A.a -> A.b -> A.c -> A.a`>`,因为这会导致绑定的无限刷新。您还可以通过块定义在例如 `A.a` 更新对象 `A.b` 之前所需的特定转换。

支持的绑定对象

支持绑定任何类型的用户定义 NSObject 子类,并且在 `UIKit` 中支持 `UILabel`、`UITextField`、`UITextView`、`UISwitch` 和 `UISlider`。但是,您可以添加对自定义 `UIView` 对象的支持。

示例

当您克隆项目并在 XCode 中打开它时,您有一个名为 SimpleExample 的文件夹,其中包含在这里用基本用法解释的代码。您还有一个名为 ComplexExample 的文件夹,这是 SKBindingManager 的功能的演示。

SKBindingManager 的基本使用方法

使用 SKBindingManager 只需将 `SKBindingManager.h` 和 `SKBindingManager.m` 拖放到您的项目中。

通常(大多数情况)您会在您的 UIViewController 上创建一个属性,但如果需要,您可以在任何 NSObject 子类中定义它。因此创建如下实例:

self.bindingManager = [[SKBindingManager alloc] init];

现在您有了绑定管理器,该管理器将负责您添加的所有绑定。因此让我们将 `UITextView` 绑定到某个随机 `Person` 模型属性的 `name`。您将这样做:

self.person = [[Person alloc] init];

//create binding options dictionary which contains all properties needed for binding
NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary];

//set binding id for this connection
[bindingOptions setObject:@"name.textFieldText" forKey:kBindingOptionBindId];

//set object and propety - from 
[bindingOptions setObject:self.person forKey:kBindingOptionFromObject];
[bindingOptions setObject:@"name" forKey:kBindingOptionFromKeyPath];

//set object and property - to
[bindingOptions setObject:self.textField forKey:kBindingOptionToObject];
[bindingOptions setObject:kBindingTextViewObservableProperty forKey:kBindingOptionToKeyPath];

//specify if you want two-way or one-way binding
[bindingOptions setObject:[NSNumber numberWithBool:YES] forKey:kBindingOptionTwoWayBinding];

//add binding
[self.bindingManager bind:bindingOptions];

此后,您的textField与Person的name属性绑定。每当您更改这两者中的任何一个时,另一个也会更新。

转换

假设您在textField中输入名称时,想在名字的末尾添加字符串@"12345"。为此,您只需在字典中添加选项即可,如下所示

SKTransformationBlock transformation = ^(id value, id toObject) { 
    NSString *name = (NSString *)value;
    return [name stringByAppendingString:@"12345"];
};

//set transformation as backward because it goes from 'to object' to 'from object'
[bindingOptions setObject:transformation forKey:kBindingOptionBackwardTransformation];

委托

如果您想通知某些对象已被更改,只需实现协议SKBindingProtocol,每当某个对象的更改发生时,都会调用- (void)bindedObject:(id)object changedKeyPath:(NSString *)keyPath;方法。首先将自身设置为委托者self.bindingManager.delegate = self,然后实现类似以下的方法

- (void)bindedObject:(id)object changedKeyPath:(NSString *)keyPath {
    if ([object isEqual:self.textField]) {
        NSLog(@"Text field has been changed");
    } else {
        NSLog(@"Persons name has been changed");
    }

    NSLog(@"TextField.text = %@ and Person.name = %@", self.textField.text, self.person.name);
}

自定义对象

如果您想为自定义的UIView对象添加绑定支持,您需要执行几个步骤。您的自定义对象必须实现SKBindingProtocol,并且它必须有一些可观察的属性。从您的自定义对象更新可观察的属性,当某些自定义更改发生时。在这样做之后,您可以将其可观察属性绑定到其他属性。

例如,请查看SKPickerViewSKTableView,它们是UIPickerViewUITableView的子类,具有用于绑定的可观察属性。