UITabBarController不加载Custom UITableView

时间:2017-04-26 00:02:05

标签: swift uitableview io uitabbarcontroller

我在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)")
                }
            }

我检查了其他状态代码,因为它们无关紧要(它们只显示一个警告框,描述了触发时的错误)。

2 个答案:

答案 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()。 - 希望这个修复对你来说太合作了!