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

iOS开发:如何将用户输入添加到TableViewController及MVC原理

解决TableView添加数据无效果的问题,附MVC原理解析

问题根源

你代码里的问题很典型——你在saveAndGoBack方法中新建了一个MyTableViewController实例,而不是操作当前正在显示的那个!这就好比你在电脑上打开了两个相同的表格文档,往新打开的那个里输入内容,原来的文档当然不会有任何变化。

修复方案

我们可以用闭包来实现数据从添加页面回传给表格页面,这是iOS里很常用的轻量数据传递方式。

首先修改你的ViewController,添加一个闭包用来传递输入的文本:

import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var myTexfield: UITextField!
    // 定义闭包,用于把输入的文本传递回表格页面
    var onSave: ((String) -> Void)?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func saveAndGoBack(_ sender: UIButton) {
        let inputText = myTexfield.text ?? "No value"
        // 调用闭包,把数据传回去
        onSave?(inputText)
        // 关闭当前添加页面
        dismiss(animated: true)
    }
}

然后修改MyTableViewController,在跳转到添加页面时设置闭包,接收数据并更新表格:

import UIKit
class MyTableViewController: UITableViewController {
    var myArray = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 初始化add按钮(如果是storyboard拖的可以忽略这段)
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addButtonTapped))
        // 提前注册cell,避免找不到复用cell的问题
        tableView.register(MyTableViewCell.self, forCellReuseIdentifier: "cell")
    }
    
    // add按钮点击事件
    @objc func addButtonTapped() {
        // 从storyboard获取添加页面实例(注意替换成你的storyboard ID)
        guard let addVC = storyboard?.instantiateViewController(withIdentifier: "ViewController") as? ViewController else { return }
        // 设置闭包,接收传递回来的文本
        addVC.onSave = { [weak self] inputText in
            guard let self = self else { return }
            // 更新模型数组
            self.myArray.append(inputText)
            // 刷新表格视图
            self.tableView.reloadData()
        }
        // 弹出添加页面
        present(addVC, animated: true)
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myArray.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? MyTableViewCell {
            cell.myLabel.text = myArray[indexPath.row]
            return cell
        }
        return UITableViewCell()
    }
}

这个场景下的MVC工作原理

iOS的MVC模式核心就是分离关注点,让每个部分只做自己擅长的事:

  • Model(模型):这里的myArray就是模型,它唯一的职责是存储我们要展示的文本数据,不关心数据怎么显示,也不关心用户怎么输入。
  • View(视图):包括UITableView、MyTableViewCell、UITextField这些控件,负责把模型里的数据可视化给用户,同时接收用户的操作(比如输入文本、点击按钮)——它只负责展示和交互,不处理数据逻辑。
  • Controller(控制器):MyTableViewController和ViewController都是控制器,是模型和视图之间的“中间人”:
    • MyTableViewController:把模型myArray里的数据交给TableView展示,同时响应用户点击add按钮的操作,打开添加页面;当收到添加页面传回来的数据时,更新模型并通知TableView刷新。
    • ViewController:负责收集用户在文本框里的输入,然后通过闭包把数据传递给表格页面的控制器,自己不处理数据的存储和展示逻辑。

简单来说:用户操作视图 → 控制器处理操作并更新模型 → 控制器通知视图刷新展示新的模型数据,这就是MVC在这个场景下的完整工作流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:45:03