2017-04-26 46 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效果更好。 。 。但在轉換首次發生在標籤欄視圖時仍不會加載 –