UITableView无法更新求助:切换返回后列表空白,reloadData无效
兄弟,我之前也踩过这个UITableView空白的坑,给你几个排查和解决的思路,应该能帮到你:
先确认数据是否还在
你切换页面回来后表格空白,大概率是arrayUsers和arrayImages这两个数据源数组被清空了。比如你在viewDidLoad里调用了resetLists(),会不会这个方法把数组重置了,但重新加载数据的逻辑没跟上?
建议你在viewWillAppear里加个打印,看看回来的时候数组里有没有数据:override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) print("当前arrayUsers数量:\(arrayUsers.count)") }如果打印出来是0,那就是数据没加载或者被清空了,得先把数据的问题解决。
把刷新逻辑放到正确的生命周期方法里
viewDidLoad只会在页面第一次初始化的时候执行,切换页面再回来是不会重新走这个方法的!所以你之前在viewDidLoad里的reloadData()根本不会在返回时触发。
应该把数据重新加载和表格刷新的逻辑移到viewWillAppear或者viewDidAppear里,比如:override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 重新调用加载数据的方法 AuthorizationUser() IndicadoresInicial() // 确保在主线程刷新表格 DispatchQueue.main.async { self.tableView.reloadData() } }确保异步加载数据后再刷新表格
你的AuthorizationUser()和IndicadoresInicial()应该是异步加载JSON数据的吧?如果直接在调用这两个方法后立刻调用reloadData(),这时候数据还没解析完成,数组还是空的,表格自然显示空白。
必须在数据加载完成的回调里刷新表格!比如用URLSession请求的话,要在completionHandler里更新数组并刷新:func IndicadoresInicial() { guard let url = URL(string: "你的JSON接口地址") else { return } URLSession.shared.dataTask(with: url) { [weak self] data, _, error in guard let data = data, error == nil else { print("数据加载失败:\(error!)") return } do { // 这里替换成你的JSON解析逻辑 let parsedData = try JSONDecoder().decode(YourModel.self, from: data) self?.arrayUsers = parsedData.users self?.arrayImages = parsedData.imageNames // 回到主线程刷新表格 DispatchQueue.main.async { self?.tableView.reloadData() } } catch { print("JSON解析失败:\(error)") } }.resume() }注意要用
[weak self]避免循环引用哦。检查代理和数据源的设置
虽然你在viewDidLoad里设置了tableView.delegate = self和tableView.dataSource = self,但有时候页面切换后可能出现代理失效的情况?保险起见,你可以直接在Storyboard里把TableView的Delegate和DataSource拖到对应的ViewController上,这样就不用在代码里设置了,更稳定。
按照上面的步骤排查,应该就能解决切换页面后表格空白的问题了!
内容的提问来源于stack exchange,提问作者Junior Sanches

