BindKit 1.0.1

BindKit 1.0.1

Electric Bolt 维护。



BindKit 1.0.1

  • Electric Bolt Limited

BindKit

一个简单的 iOS 双向数据绑定框架。 只需学习一个 API

支持 Objective-C,Swift 5,Xcode 10.2,iOS 8 及以上。

作为 Cocoapod 或静态库发货,可链接到您的应用程序(或者您可以将源直接包含到项目中)。静态库作为 'fat' 库构建,包含以下架构:i386,x86_64,armv7s,armv7,arm64 和 bitcode。

寻找旧版本?

标记为 1.0.0 的版本支持 Objective-C,Swift 3 和 4,Xcode 8,9 和 10,iOS 8 及以上。

当前支持视图

以下视图由 BindKit 直接支持

视图类 视图属性
UIBarButtonItem enabled
UIButton enabled, hidden
UIDatePicker date, enabled, hidden
UIImageView image, hidden
UILabel text, attributedText, hidden
UIPageControl currentPage, numberOfPages, enabled, hidden
UISegmentedControl selectedSegmentIndex, enabled, hidden
UISlider value, enabled, hidden
UIStepper value, enabled, hidden
UISwitch on, enabled, hidden
UITextFieldText text, attributedText, enabled, hidden
UITextView text, attributedText, editable, hidden

没有看到您感兴趣的属性或类? 提交一个拉取请求以添加属性或类,或者使用Vendor API 在您的应用程序中添加自定义功能。请参考 BindingExample 目录下 MySearchBar.swift 中的自定义功能示例。

绑定

数据绑定是双向的——你模型属性的改变会自动应用到你视图属性,反之亦然。

只需学习一个API。

Objective-C

[model bindObjectSel: @selector(addressStr) toView: addressTextField viewKey: UITextFieldText];

Swift

model.bindObjectKey(#keyPath(model.addressStr), toView: addressTextField, viewKey: UITextFieldText)

几个简单的规则

以下规则适用于使用BindKit结合Swift:

  1. 你的模型对象必须继承自NSObject
  2. 参与绑定的模型属性需要标记为@objc dynamic

请参阅底层实现细节以了解详细信息。

示例

Swift

class LogonModel: NSObject {
	
	@objc dynamic var username: String!
	@objc dynamic var password: String!
	@objc dynamic var logonEnabled: Boolean
	
	override func boundPropertiesDidUpdate() {
		logonEnabled = validate()
	}

	func validate() -> Boolean
		guard username!.trimmingCharacters(in: CharacterSet.whitespaces).count > 0 else { return false }
		guard password!.trimmingCharacters(in: CharacterSet.whitespaces).count > 0 else { return false }
		return true
	}
}

class LogonController: UITableViewController {

	@IBOutlet weak var usernameTextField: UITextField!
	@IBOutlet weak var passwordTextField: UITextField!
	@IBOutlet weak var logonButton: UIButton!

	var model = LogonModel()

	override func viewDidLoad() {
		model.bindKey(#keyPath(model.username), view: usernameTextField, viewKey: UITextFieldText)
		model.bindKey(#keyPath(model.password), view: passwordTextField, viewKey: UITextFieldText)
		model.bindKey(#keyPath(model.logonEnabled), view: logonButton, viewKey: UIButtonEnabled)
	}

}

将BindKit添加到您的应用程序(手动集成)

  • libBindKit.a链接到您的应用程序中
  • 配置Header Search Paths以允许Xcode找到BindKit.hBindKitVendor.h
  • -ObjC-all_load添加到Other Linker Flags

将BindKit添加到您的应用程序(Cocoapods集成)

  • 如果您还没有为您的应用程序创建Podfile,请现在创建一个: pod init
  • 将以下内容添加到您的Podfile中: pod 'BindKit'
  • 保存文件并运行: pod install

建筑

虽然 libBindKit.a 静态库是预先构建并包含在仓库中的,但如果需要重新构建,请执行以下命令

./buildlibrary.sh

生成的静态库和头文件将被放置到 release 目录中。

当前构建脚本假设使用 Xcode 10.2/SDK12.2。如果您使用的是不同的 Xcode 构建链,请根据需要调整构建脚本中的 IOSSDK_VER 变量。

内部结构

模型

使用键值观察(KVO)监控参与绑定模型的属性变化。因此模型对象必须继承自 NSObject,如果使用 Swift,则必须用 @objc dynamic 标注属性。

视图

参与绑定的视图在运行时动态地子类化。每个支持的视图有一个动态子类实现。根据视图的不同,需要不同的方法来监控变化:目标-操作、代理或通知。

不支持视图? 提交一个包含您的更改的 pull request 以添加属性或类,或在您的应用程序中使用供应商 API 添加自定义功能。