UITabBarController不加载自定义UITableView
我有我的UITabBarController中的UITableView加载一个奇怪的问题。当我最初转换到TabBar视图(从“登录”视图控制器)时,表不会加载/显示其数据。它只是在我点击不同的标签之后,然后回到原来的标签,它才会加载信息。该表的数据正从服务器中检索,这发生在一个函数中,该函数在相关选项卡的viewDidLoad和viewWillAppear中运行。UITabBarController不加载自定义UITableView
我不完全确定为什么会发生这种情况。下面的代码是viewDidLoad和viewWillAppear函数,用于容纳tableView的选项卡。任何提示都表示赞赏。谢谢。
override func viewDidLoad() {
super.viewDidLoad()
getTableInfo()
tableView.allowsSelection = false
tableView.delegate = self
tableView.dataSource = self
tableView.reloadData()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
getTableInfo()
tableView.reloadData()
}
编辑:下面是用于从服务器获取表的信息的代码,到一个变量tableInfo:
let task = URLSession.shared.dataTask(with: request) { data, response, error in
let httpResponse = response as! HTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
do {
if let data = data,
let jsonResponse = try JSONSerialization.jsonObject(with: data) as? [String: Any] {
self.tableView.removeAll()
if let locations = jsonResponse["pictures"] as? String {
self.tableInfo = locations.lines
self.tableInfo.reverse()
}
}
} catch {
print("Error deserializing JSON: \(error)")
}
}
存在用于我省略,因为它们其他状态码检查是无关紧要的(他们只是显示一个警告框,描述如果触发了错误)。
getTableInfo
方法是异步的,因此当您拨打tableView.reloadData()
时,self.tableInfo
仍为空。在异步方法完成后,它只是填充了数据。
因此,要修复它,只需在将数据设置为self.tableInfo
变量后调用tableView.reloadData()
即可。
if let locations = jsonResponse["pictures"] as? String {
self.tableInfo = locations.lines
self.tableInfo.reverse()
self.tableView.reloadData()
}
对于在这种情况下仔细编码,你可能需要在封闭创建weak self
防止保持这一类的实例。而且您还需要重新加载主要thead中的表格视图。
let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in
guard let `self` = self else { return }
let httpResponse = response as! HTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
do {
if let data = data,
let jsonResponse = try JSONSerialization.jsonObject(with: data) as? [String: Any] {
self.tableView.removeAll()
if let locations = jsonResponse["pictures"] as? String {
self.tableInfo = locations.lines
self.tableInfo.reverse()
DispatchQueue.main.async(execute: {
self.tableView.reloadData()
})
}
}
} catch {
print("Error deserializing JSON: \(error)")
}
}
所以这个工作,但是当tabbarview第一次加载时,它仍然不加载数据。至于上下文,我有两个标签有自定义表。首先转换到tabbar不会加载数据(即使我有函数在viewdidload和viewillappear中执行此操作),但是在两个选项卡之间单击时,数据会立即加载(这是对以前的改进,但仍然会加载时,我第一次转换到标签栏)。 –
你添加了'DispatchQueue ...'吗?因为重载tableview操作需要在主线程中执行。 – t4nhpt
是的,它与DispatchQueue效果更好。 。 。但在转换首次发生在标签栏视图时仍不会加载 –
如果我不得不猜测,我会说服务器的数据在视图加载后返回。 –
在从服务器获取数据的函数中是否有完成处理程序?你可以分享该代码吗? – mat
只是分享了代码! –