2017-12-31 30 views
0

私はfirebaseからデータを取得してテーブルビューで表示するように取り組んでいます。私は受け取ったデータを配列に取り込み、配列を使ってtableviewを塗りつぶしますが、データは表示されません。ユーザーが表示する前にテーブルビューに配列を表示

私は、配列が生成される前にtableviewがロードされているということを認識しました。私はviewdidloadにreloadDataを置こうとしましたが、これは表示された後にデータをポップインし、きれいに見えません。

遷移がスムーズになるように、ビューが表示される前にデータを読み込むようにテーブルビューを取得するにはどうすればよいですか?

このコードは、私のviewDidLoadメソッド内にある:代わりにコールfunc insertSections(IndexSet, with: UITableViewRowAnimation)

let categoryRef = Database.database().reference().child("category/\(category)") 
    let user = Auth.auth().currentUser 
    if let user = user { 
     let uid = user.uid 
     categoryRef.observeSingleEvent(of: .value, with: { (snapshot) in 
      if snapshot.hasChildren(){ 
       for child in (snapshot.value as? NSDictionary)! { 
        if let object = child.value as? [String:AnyObject]{ 
         let name = object["name"] as! String 
         self.nameArray.append(name) 
         self.categoryDict["\(name)"] = child.key as! String 
        } 

       } 
       self.tableView.reloadData() 
      } 

     }) 
    } 

} 

答えて

0

は、あなたがすべての子を追加した直後のデータをリロードしてくださいbeginUpdatesおよびendUpdates。また、メインキューのUIを更新してください。

+0

喜んで助けてください。それがうまくいけば、upvoteして正しい答えとしてマークして、問題を抱えている他の人に解決策を見せてください:) – barbarity

0

が、への呼び出しの内部でそれをラップすることを忘れないでください:

let categoryRef = Database.database().reference().child("category/\(category)") 
    let user = Auth.auth().currentUser 
    if let user = user { 
     let uid = user.uid 
     categoryRef.observeSingleEvent(of: .value, with: { (snapshot) in 
      if snapshot.hasChildren(){ 
       for child in (snapshot.value as? NSDictionary)! { 
        if let object = child.value as? [String:AnyObject]{ 
         let name = object["name"] as! String 
         self.nameArray.append(name) 
         self.categoryDict["\(name)"] = child.key as! String 
        } 

       } 
      } 

     }) 
    } 

} 
0

categoryRef.observeSingleEvent 

は非同期ですので、あなたはブロックが終了した後にテーブルビューをリロードする必要があり、道の@barbarityを提案しています。

あなたはスムーズな移行をしたい場合は、あなたのViewControllerを提示する前に、この呼び出し

let categoryRef = Database.database().reference().child("category/\(category)") 

を開始するには、配列を設定し、それを提示します。

しかし、のviewDidLoad上のデータのロードを開始し、UIローディング機構(スピナー)

+0

ありがとうございました!だから、いつテーブルビューが読み込まれますか?それはviewdidloadメソッドの間、またはテーブルビューのデリゲートを設定するたびにですか? –

+0

viewDidLoadですべてが設定されていれば、呼び出されます。それ以外の場合は、データを再読み込みする必要があります –

0

私はあなたが感じを感じるようになります他のビューを作ることができると思いを持っている非同期処理とほとんどの場合で練習データの準備が整った後、 'データポップ'が表示されます。

極端な条件では、あなたは、テーブルビューのために件のデータの後にテーブルビューと非表示インジケータが(Objective-Cで)準備ができて表示され、その後、全体のテーブルビューを非表示にしたりしても、画面上のアクティビティインジケータを表示しようとするかもしれません

- (void)viewDidLoad { 

    //do init work ... 

    self.tableview.hidden = YES; 
    [self showIndicator]; 
    [self requestDataFinish:^{ 
      self.tableview.hidden = NO; 
      [self hideIndicator]; 
      [self.tableview reload]; 
    }];   

} 
関連する問題