Swift 5 MVC架构下如何检测文本框变化并传递至模型函数?
MVC架构下Swift文本框内容同步到模型的实现方案
核心MVC原则遵循
在MVC模式里,视图(文本框)仅负责展示与触发交互事件,视图控制器(VC)作为中间调度层,接收视图的事件通知,处理后传递数据给模型,模型只专注业务逻辑处理,完全脱离UI相关代码。整个流程清晰闭环:文本框内容变化 → VC捕获变化 → 调用模型对应方法传递数据。
具体代码实现
1. 模型类(独立Swift文件)
模型只需定义接收文本的方法,聚焦业务逻辑(比如文本验证、存储、数据转换等),禁止引入UIKit:
// TextModel.swift class TextModel { // 接收文本变化的核心方法,根据业务需求扩展逻辑 func updateTextContent(_ newText: String) { // 示例:打印接收的文本,实际可替换为存储、接口请求等逻辑 print("模型已接收新文本:\(newText)") // 这里添加你的业务处理代码,比如正则验证文本格式、保存到UserDefaults等 } }
2. 主视图控制器(VC)
VC需要完成两个核心动作:监听文本框内容变化,以及持有模型实例并调用其方法。
方式一:使用UITextFieldDelegate(推荐,更灵活的输入控制)
// MainViewController.swift import UIKit class MainViewController: UIViewController, UITextFieldDelegate { // 文本框实例(可通过Storyboard关联或代码初始化) let inputTextField = UITextField() // 持有模型实例 private let textModel = TextModel() override func viewDidLoad() { super.viewDidLoad() // 配置文本框基础属性 inputTextField.frame = CGRect(x: 20, y: 100, width: view.frame.width - 40, height: 44) inputTextField.borderStyle = .roundedRect inputTextField.placeholder = "请输入内容" // 设置代理监听输入事件 inputTextField.delegate = self view.addSubview(inputTextField) } // 文本框内容变化时触发的代理方法,可拦截输入行为 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // 计算最新的文本内容 guard let currentText = textField.text else { return true } let updatedText = (currentText as NSString).replacingCharacters(in: range, with: string) // 传递最新文本给模型 textModel.updateTextContent(updatedText) // 返回true允许输入,返回false可拦截不符合要求的输入 return true } }
方式二:使用UIControl.Event.editingChanged事件(适合无需拦截输入的场景)
如果不需要控制输入权限,直接监听编辑变化事件更简洁:
// 在MainViewController的viewDidLoad中添加事件绑定 inputTextField.addTarget(self, action: #selector(textFieldContentChanged(_:)), for: .editingChanged) // 对应的事件处理方法 @objc private func textFieldContentChanged(_ textField: UITextField) { guard let newText = textField.text else { return } textModel.updateTextContent(newText) }
关键注意事项
- 严格解耦模型与UI:模型类绝对不能导入UIKit,也不能持有任何UI组件引用,确保只处理数据逻辑。
- 明确VC职责边界:VC只做事件转发,不要在VC中处理本该属于模型的业务逻辑(比如文本格式验证、数据持久化)。
- 避免循环引用:如果模型需要回调VC反馈处理结果,必须使用
weak var引用VC。
内容的提问来源于stack exchange,提问作者Gucci
相关产品推荐
相关产品推荐

