Swift MVVM 自定义Bindable UITextField绑定及双向绑定
MVVM重构中基于自定义Observables的实现方案梳理
重构前期准备
当前启动应用存量代码的重构工作,核心目标是迁移至MVVM设计模式完成代码解耦,过程中同步梳理了Observables的相关实现逻辑:
- 已掌握Observables的工作原理,明确其在MVVM架构中承担视图与视图模型数据联动的核心作用
- 完成三类常见响应式实现方案的调研对比:
- 自研轻量Observables方案(当前正在使用的落地路径)
- Event Bus / Notification Center 事件通知方案
- FRP函数式响应编程方案(代表实现为ReactiveCocoa / RxSwift)
当前已落地的基础实现
泛型Bindable类
当前已完成通用绑定能力的泛型类声明,代码如下:
import UIKit class Bindable<T> { var value: T? { didSet { observer?(value) } } var observer: ((T?) -> ())? func bind(observer: @escaping (T?) -> ()) { self.observer = observer } }
存量页面交互逻辑
当前需要重构的页面包含两个文本输入框(emailInput、passwordInput)与一个登录按钮,业务规则为:两个文本框内容均不为空时,登录按钮才可点击。
目前已为两个文本框添加.editingChanged事件的响应target,关联代码:
emailInput.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged) passwordInput.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
对应的事件处理方法当前仍写在ViewController中,逻辑为实时判断输入内容、控制按钮可用状态:
/// 控制登录按钮的启用/禁用状态 @objc func textFieldDidChange(_ textField: UITextField) { if (emailInput.text == "") || (passwordInput.text == "") { logInButton.enableButton(false) } else { logInButton.enableButton(true) } }
待确认的核心问题
- 如何将文本框联动登录按钮状态的判断逻辑,从ViewController迁移至ViewModel层实现,符合MVVM的职责边界要求
- 当前自定义实现的
Bindable类,是否能够支撑双向绑定的使用场景
内容的提问来源于stack exchange,提问作者Savvy
相关产品推荐
相关产品推荐

