KJSimpleBinding 1.0.0

KJSimpleBinding 1.0.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

未声明 维护。



  • Kristopher Johnson

KJSimpleBinding 是一个库,它使 iOS 应用程序中简单数据绑定场景中使用键值编码 (KVC) 和键值观测 (KVO) 变得容易。

该库受到了 Mac OS X 的 Cocoa 绑定 机制的启发,但仅实现了其中的一小部分功能。由 KJSimpleBinding 提供的数据绑定是单向的:即,当模型对象的属性更改时,库会自动更新用户界面元素,但 UI 元素的变化不会导致模型对象自动更改。

目录

此 Xcode 工作区提供以下目标

  • KJSimpleBinding - 一个提供 KJBindingManager 类的静态库。您可以将此库复制到自己的项目中,或者只复制 .h.m 文件。
  • KJSimpleBindingTests - KJSimpleBinding 库的单元测试。要运行测试,请选择 Xcode 中的 KJSimpleBinding 模式,然后选择 产品 > 测试 菜单项。
  • KJSimpleBindingDemo - 一个简单的 iOS 应用程序,演示了 KJBindingManager 的使用。

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的实例。如果您尝试将该值分配给UILabeltext属性,将引发异常。因此,我们将指定一个值转换块,该块调用-stringValueNSNumber转换为NSString

[_bindingManager bindObserver:myLabel   keyPath:@"text"
                    toSubject:mySubject keyPath:@"numericProperty"
           withValueTransform:^(id value) { return [value stringValue]; }];

ARC支持

主分支不支持ARC。如果您在一个ARC项目中使用KJBindingManager类,您需要为KJBindingManager.m添加-fno-objc-arc编译器选项。

有一个实验分支arc,它将主分支的代码转换为ARC。它尚未经过广泛测试,但是ARC版本最终将移入主分支,而noarc分支将包含旧代码。

未来方向

以下特性已被计划

  • 验证
  • 具有内置绑定功能的UIViewControllerUITableViewController子类(可能基于AppKit的NSObjectControllerNSArrayController的功能)。

请注意,由于UIKit组件的限制,详尽的Cocoa绑定在iOS上不可行。KJSimpleBinding项目的目标是创建一个良好的iOS数据绑定机制,因此在没有相似性或熟悉性简单追求的情况下,将不会尝试与Cocoa绑定兼容。

许可证

版权所有 © 2012 Kristopher Johnson

以下条件,任何获得此软件及其相关文档文件(以下简称“软件”)副本的人,未经限制地处理软件,包括但不限于本软件的使用、复制、修改、合并、发布、分发、再许可和/或出售副本,并允许接受软件的人这样做:

上述版权声明和本许可声明应包括在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的担保,无论是明示的还是暗示的,包括但不限于对适销性、特定目的适用性和非侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或任何其他行为,出自、源自或与软件或其使用或其他交易有关。