You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    }
}

待确认的核心问题

  1. 如何将文本框联动登录按钮状态的判断逻辑,从ViewController迁移至ViewModel层实现,符合MVVM的职责边界要求
  2. 当前自定义实现的Bindable类,是否能够支撑双向绑定的使用场景

内容的提问来源于stack exchange,提问作者Savvy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 16:06:02