2017-04-26 44 views
0

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

存在用于我省略,因为它们其他状态码检查是无关紧要的(他们只是显示一个警告框,描述如果触发了错误)。

+1

如果我不得不猜测,我会说服务器的数据在视图加载后返回。 –

+0

在从服务器获取数据的函数中是否有完成处理程序?你可以分享该代码吗? – mat

+0

只是分享了代码! –

回答

1

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)") 
      } 
     } 
+0

所以这个工作,但是当tabbarview第一次加载时,它仍然不加载数据。至于上下文,我有两个标签有自定义表。首先转换到tabbar不会加载数据(即使我有函数在viewdidload和viewillappear中执行此操作),但是在两个选项卡之间单击时,数据会立即加载(这是对以前的改进,但仍然会加载时,我第一次转换到标签栏)。 –

+0

你添加了'DispatchQueue ...'吗?因为重载tableview操作需要在主线程中执行。 – t4nhpt

+0

是的,它与DispatchQueue效果更好。 。 。但在转换首次发生在标签栏视图时仍不会加载 –