KJSimpleBinding
是一个库,它使 iOS 应用程序中简单数据绑定场景中使用键值编码 (KVC) 和键值观测 (KVO) 变得容易。
该库受到了 Mac OS X 的 Cocoa 绑定 机制的启发,但仅实现了其中的一小部分功能。由 KJSimpleBinding
提供的数据绑定是单向的:即,当模型对象的属性更改时,库会自动更新用户界面元素,但 UI 元素的变化不会导致模型对象自动更改。
此 Xcode 工作区提供以下目标
KJSimpleBinding
- 一个提供 KJBindingManager
类的静态库。您可以将此库复制到自己的项目中,或者只复制 .h
和 .m
文件。KJSimpleBindingTests
- KJSimpleBinding
库的单元测试。要运行测试,请选择 Xcode 中的 KJSimpleBinding
模式,然后选择 产品 > 测试 菜单项。KJSimpleBindingDemo
- 一个简单的 iOS 应用程序,演示了 KJBindingManager
的使用。通常您会创建一个 UIViewController
子类的实例变量或属性作为绑定管理器。创建一个 KJBindingManager
实例如下所示
_bindingManager = [[KJBindingManager alloc] init];
通过调用 -bindObserver:keyPath:toSubject:keyPath:
方法设置绑定。
[_bindingManager bindObserver:myLabel keyPath:@"text"
toSubject:myModelObject keyPath:@"stringProperty"];
在此示例中,每当 myModelObject.stringProperty
设置为新值时,myLabel.text
的值都会更新。
观察者必须对指定的键路径 KVC 兼容,主题必须对指定的键路径 KVO 兼容。
观察者和主题属性必须具有兼容的类型;尝试将数字属性绑定到字符串属性或相反将导致运行时异常。(有关解决此问题的方法,请参阅下面的“值转换”部分。)
请注意,-bindObserver:keyPath:toSubject:keyPath:
不会保留观察者或主题,因此调用者必须保证这些对象引用保持有效。
在绑定管理器开始执行观察/更新行为之前,必须将其启用。建议在视图控制器中的viewWillAppear:
方法中启用它,然后在viewWillDisappear:
方法中禁用它,这样观察的开销只会在绑定对象在屏幕上时应用。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[_bindingManager enable];
}
- (void)viewWillDisappear:(BOOL)animated {
[_bindingManager disable];
[super viewWillDisappear:animated];
}
调用-removeAllBindings
方法来移除绑定。在使用之前调用这个方法是良好的编程习惯,但如果绑定管理器在有活动绑定时被释放,它将自动执行。
请参阅KJSimpleBindingDemo示例代码以获取完整的示例。
在设置观察者的值之前,您可以将从源接收的值转换成另一种表示形式。例如,您可能需要将数值转换成字符串,或者将布尔值转换成“开”或“关”。
您可以通过指定一个值转换块到-bindObserver:keyPath:toSubject:keyPath:withValueTransform:
来完成这个任务。
例如,如果主题暴露一个数字属性,那么该值将是NSNumber
的实例。如果您尝试将该值分配给UILabel
的text
属性,将引发异常。因此,我们将指定一个值转换块,该块调用-stringValue
将NSNumber
转换为NSString
。
[_bindingManager bindObserver:myLabel keyPath:@"text"
toSubject:mySubject keyPath:@"numericProperty"
withValueTransform:^(id value) { return [value stringValue]; }];
主分支不支持ARC。如果您在一个ARC项目中使用KJBindingManager
类,您需要为KJBindingManager.m
添加-fno-objc-arc
编译器选项。
有一个实验分支arc
,它将主分支的代码转换为ARC。它尚未经过广泛测试,但是ARC版本最终将移入主分支,而noarc
分支将包含旧代码。
以下特性已被计划
UIViewController
和UITableViewController
子类(可能基于AppKit的NSObjectController
和NSArrayController
的功能)。请注意,由于UIKit组件的限制,详尽的Cocoa绑定在iOS上不可行。KJSimpleBinding项目的目标是创建一个良好的iOS数据绑定机制,因此在没有相似性或熟悉性简单追求的情况下,将不会尝试与Cocoa绑定兼容。
版权所有 © 2012 Kristopher Johnson
以下条件,任何获得此软件及其相关文档文件(以下简称“软件”)副本的人,未经限制地处理软件,包括但不限于本软件的使用、复制、修改、合并、发布、分发、再许可和/或出售副本,并允许接受软件的人这样做:
上述版权声明和本许可声明应包括在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何形式的担保,无论是明示的还是暗示的,包括但不限于对适销性、特定目的适用性和非侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或任何其他行为,出自、源自或与软件或其使用或其他交易有关。