2017-04-26 13 views
0

UITabBarController内で私のUITableViewの読み込みに奇妙な問題があります。私が最初にTabBarビュー( "ログイン"ビューコントローラから)に移行するとき、テーブルはそのデータをロード/表示しません。別のタブをクリックした後で元のタブに戻り、情報を読み込むだけです。テーブルのデータがサーバーから取得されています。このデータは、関連するタブのviewDidLoadとviewWillAppearの両方で実行される関数で発生します。UITabBarControllerがカスタムUITableViewをロードしない

なぜこれが起こっているのか完全にわかりません。以下のコードは、tableViewを格納するタブのviewDidLoadおよびviewWillAppear関数です。任意のヒントが評価されます。ありがとう。

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() 
} 

EDIT:以下の変数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

しかし、これは動作しますが、タブバービューが最初にロードされても、データはロードされません。コンテキストに関しては、カスタムテーブルを持つ2つのタブがあります。最初にタブバーに移行してもデータはロードされません(viewdidloadとviewillappearでこれを行う関数を持っています)。しかし、2つのタブをクリックすると、データは即座にロードされます私が最初にタブバーに移行するときに読み込まれます)。 –

+0

'DispatchQueue ...'を追加しましたか? reload tableviewアクションはメインスレッドで実行する必要があるためです。 – t4nhpt

+0

それはDispatchQueueでうまく動作します。 。 。遷移が最初にタブバー・ビューに起こってもまだロードされません –

関連する問題