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
相关产品推荐
相关产品推荐

