关闭View B后View A的UITableView方法及viewDidLoad未调用求助
嘿,别担心!新手刚接触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

