我在UITabBarController中加载了UITableView时遇到了一个奇怪的问题。当我最初转换到TabBar视图(来自"登录"视图控制器)时,表不会加载/显示其数据。只有在我在另一个选项卡上单击之后,然后返回到原始选项卡,它才会加载信息。正在从服务器检索表的数据,该服务器在相关选项卡的viewDidLoad和viewWillAppear中运行的函数中发生。
我不完全确定为什么会这样。下面的代码是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)")
}
}
我检查了其他状态代码,因为它们无关紧要(它们只显示一个警告框,描述了触发时的错误)。
答案 0 :(得分:1)
getTableInfo
方法已异步,因此当您致电tableView.reloadData()
时,self.tableInfo
仍为空。异步方法完成后,它只是填充数据。
因此,要解决此问题,您只需在将数据设置为tableView.reloadData()
变量后调用self.tableInfo
。
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)")
}
}
答案 1 :(得分:0)
对于我正在进行的项目,我遇到了同样的事情。我的tableView不会显示我在项目的TabBarController类中从Firebase加载的数据。通过将代码从该类移动到持有tableview的ViewController来修复它。在从Firebase检索数据的代码中,在将每个子服务器从服务器追加到我的数据数组中之后,我调用了reloadData()。 - 希望这个修复对你来说太合作了!