Swift3中关闭弹窗后UITableView未重载问题排查及代码求助
解决UITableView添加数据后不刷新的问题
我太懂你这种明明数据已经成功添加,但关闭弹窗后列表纹丝不动的抓狂感了😅。咱们一步步排查解决:
核心问题:数据更新后没触发TableView刷新
你现在的情况大概率是弹窗保存数据后,没有通知主ViewController去调用TableView的刷新方法。数据确实进了数组,但TableView不知道数据发生了变化,自然不会重新渲染界面。
具体解决方案
假设你的弹窗是一个独立的ViewController(比如叫AddDetailVC),我们用闭包回调的方式来传递数据并触发刷新,这是Swift里最常用的轻量组件通信方式:
第一步:给弹窗VC添加回调闭包
在你的弹窗ViewController里定义一个闭包,用来把输入的字段传递回主VC:
class AddDetailVC: UIViewController { // 假设你有三个输入框对应position、company、location @IBOutlet weak var positionTextField: UITextField! @IBOutlet weak var companyTextField: UITextField! @IBOutlet weak var locationTextField: UITextField! // 定义回调闭包,传递三个字段的值 var onSaveCompletion: ((String, String, String) -> Void)? // 保存按钮点击事件 @IBAction func saveButtonTapped(_ sender: UIButton) { // 先校验输入不为空 guard let position = positionTextField.text?.trimmingCharacters(in: .whitespaces), let company = companyTextField.text?.trimmingCharacters(in: .whitespaces), let location = locationTextField.text?.trimmingCharacters(in: .whitespaces), !position.isEmpty, !company.isEmpty, !location.isEmpty else { // 这里可以加个提示,比如输入不能为空 return } // 调用闭包,把数据传回去 onSaveCompletion?(position, company, location) // 关闭弹窗 dismiss(animated: true) } }
第二步:主VC弹出弹窗时绑定闭包,更新数据并刷新TableView
在你的EditTestVC里,点击添加按钮弹出弹窗的时候,设置闭包逻辑:
class EditTest: UIViewController , UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! var position = [AnyObject]() var company = [AnyObject]() var location = [AnyObject]() override func viewDidLoad() { super.viewDidLoad() // 别忘了设置TableView的数据源和代理(如果IB里没连线的话) tableView.dataSource = self tableView.delegate = self // 注册cell(如果没在IB里设置的话) tableView.register(UITableViewCell.self, forCellReuseIdentifier: "YourCellIdentifier") } // 添加按钮点击事件 @IBAction func addButtonTapped(_ sender: UIButton) { // 从storyboard获取弹窗VC(根据你的实际ID修改) guard let addVC = storyboard?.instantiateViewController(withIdentifier: "AddDetailVC") as? AddDetailVC else { return } // 绑定回调闭包,用weak self避免循环引用 addVC.onSaveCompletion = { [weak self] pos, comp, loc in // 把数据添加到数组里 self?.position.append(pos as AnyObject) self?.company.append(comp as AnyObject) self?.location.append(loc as AnyObject) // 关键!刷新TableView self?.tableView.reloadData() } // 弹出弹窗 present(addVC, animated: true) } // 确保你的TableView数据源方法是正确的 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 三个数组长度应该一致,返回其中一个的count就行 return position.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath) // 给cell赋值 cell.textLabel?.text = position[indexPath.row] as? String cell.detailTextLabel?.text = "\(company[indexPath.row] as? String ?? "") | \(location[indexPath.row] as? String ?? "")" return cell } }
额外要检查的点
- 避免循环引用:闭包里一定要用
[weak self],不然会导致内存泄漏 - 数据源方法正确性:确保
numberOfRowsInSection返回的是数组的最新长度,cellForRowAt里正确取到对应下标的数据 - TableView的数据源/代理设置:要么在IB里把TableView的dataSource和delegate拖到VC上,要么在
viewDidLoad里手动设置
这样修改后,你点击保存按钮添加数据,关闭弹窗的同时TableView就会自动刷新啦!
内容的提问来源于stack exchange,提问作者swift test
相关产品推荐
相关产品推荐

