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

关闭View B后View A的UITableView方法及viewDidLoad未调用求助

解决ViewB Dismiss后ViewA表格不刷新的问题

嘿,别担心!新手刚接触UITableView遇到这种问题太正常了,咱们一步步拆解问题,搞定它~

首先先澄清一个点:你说ViewA的viewDidLoad没执行是完全正常的!viewDidLoad只有在视图第一次被加载到内存的时候才会触发,你从ViewB dismiss回到ViewA时,ViewA的视图早就已经存在了,所以这个方法不会再次调用,不用纠结这个哦。

重点是表格的numberOfRowsInSection和cellForRowAt没被调用,这说明表格没触发刷新逻辑,下面是几个最常见的原因和解决办法:

1. 数据源更新后,没通知表格刷新

如果你在ViewB里修改了ViewA的数据源(比如添加/删除数据),但回到ViewA后没告诉表格“数据变啦,快更新!”,表格就不会主动调用那两个数据源方法。

解决办法:用闭包传递刷新信号(新手友好)

  • 在ViewB里定义一个闭包属性,dismiss前调用它通知ViewA
class ViewB: UIViewController {
    // 定义闭包,用来通知ViewA刷新表格
    var onDismiss: (() -> Void)?

    @IBAction func closeButtonTapped(_ sender: UIButton) {
        // 假设你在这里修改了要传给ViewA的数据
        // ...
        // 调用闭包,通知ViewA刷新
        onDismiss?()
        self.dismiss(animated: true, completion: nil)
    }
}
  • 在ViewA跳转到ViewB时,给闭包赋值,里面写刷新逻辑
class ViewA: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    var dataList: [String] = []

    @IBAction func openViewBTapped(_ sender: UIButton) {
        let viewB = storyboard?.instantiateViewController(withIdentifier: "ViewB") as! ViewB
        // 给闭包赋值,弱引用self避免循环引用
        viewB.onDismiss = { [weak self] in
            // 这里更新数据源(比如从ViewB拿到新数据)
            self?.dataList.append("从ViewB新增的内容")
            // 关键!告诉表格刷新
            self?.tableView.reloadData()
        }
        present(viewB, animated: true, completion: nil)
    }
}

2. 表格的Delegate/DataSource没正确设置

这是新手最容易犯的低级错误!如果表格不知道谁来提供数据(dataSource)和处理交互(delegate),那自然不会调用数据源方法。

解决办法:

  • 首先确保ViewA的类声明遵守了协议:
class ViewA: UIViewController, UITableViewDelegate, UITableViewDataSource {
    // ...
}
  • 然后在viewDidLoad里手动设置delegate和dataSource:
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
}

或者如果你是用Storyboard拖的表格,也可以直接在Storyboard里把表格的delegate和dataSource拖到ViewA的ViewController上。

3. 数据源数组为空

如果你的dataList数组是空的,numberOfRowsInSection会返回0,表格没有行需要显示,自然cellForRowAt也不会被调用。

解决办法:

检查回到ViewA时,数据源数组是否真的有内容。可以在viewWillAppear里打印数组的count,确认数据是否正确:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("当前数据源数量:\(dataList.count)")
    tableView.reloadData()
}

4. 利用ViewA的生命周期方法强制刷新

每次从ViewB回到ViewA时,viewWillAppear或viewDidAppear会被调用,你可以在这里直接调用tableView.reloadData(),确保每次ViewA显示时表格都是最新状态。

比如:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:40:19