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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:03:14