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:
- 你的模型对象必须继承自
NSObject
。 - 参与绑定的模型属性需要标记为
@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.h
和BindKitVendor.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 添加自定义功能。