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.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
,并且它必须有一些可观察的属性。从您的自定义对象更新可观察的属性,当某些自定义更改发生时。在这样做之后,您可以将其可观察属性绑定到其他属性。
例如,请查看SKPickerView
或SKTableView
,它们是UIPickerView
和UITableView
的子类,具有用于绑定的可观察属性。