2017-04-02 18 views
0

Firebaseを使用してTableViewセルをどのように埋めることができますか?私はFirebaseでいっぱいになる配列を使ってデータを埋めようとしていますが、データが非同期でいっぱいになっているので、配列にgetData()関数以外のデータを埋め込む方法がわかりません。現在のところ、データは補完ハンドラの内部に埋め込まれていますが、それ以外はゼロです。プロトタイプセルにFirebaseを使用して配置された配列を配置する

import UIKit 
import Firebase 

class ProxiesListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

@IBOutlet weak var ProxiesTableView: UITableView! 

var proxyname:[String] = [] 
var proxyprice:[Int] = [] 
var proxycountry:[String] = [] 

var databaseRef : FIRDatabaseReference! 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return proxyname.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ProxiesTableViewCell 
    cell.countryFlag.image = UIImage(named: proxycountry[indexPath.row]) 
    cell.NameLabel.text = proxyname[indexPath.row] 
    cell.priceLabel.text = "$" + String(proxyprice[indexPath.row]) 
    return(cell) 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    //add code 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    ProxiesTableView.delegate = self 
    ProxiesTableView.dataSource = self 

    getData() 
} 

func getData() { 
    databaseRef = FIRDatabase.database().reference() 

    /* 
    proxyname = ["50 Proxies (24 Hours)", "100 Proxies", "10 Proxies", "60 Proxies (48 Hours)"] 
    proxyprice = [600, 140, 60, 10] 
    proxycountry = ["CA", "UK", "UK", "US"] 
    */ 

    self.databaseRef.child("ProxiesItemsFeed").observe(.childAdded, with: { (snapshot) in 

     if let proxynames = snapshot.key as String! { 
      self.proxyname.append(proxynames) 
       self.databaseRef.child("ProxiesItemsFeed").child(proxynames).observe(.childAdded, with: { (snapshot) in 

        if let country = snapshot.key as String! { 
         self.proxycountry.append(country) 
        } 

        if let price = snapshot.value as! Int! { 
         self.proxyprice.append(price) 
        } 
       }) 
      } 
     }) 
    } 
} 
+0

* print(snapshot)*をクロージャーの最初の行に追加するとどうなりますか?何かを印刷していますか? 2番目の質問:.childAddedを使用していくつのノードを繰り返しますか?最後に、クロージャ内でtableView.reloadData()が欠けています。しかし、1000回のchildViewを持っていてtableViewを1000回リロードすると非常に効率的ではありません。これを手助けするオプションはいくつかありますが、解決策を提案する前にまず情報が必要です。 – Jay

+0

私は今すぐ動作するようになっていますが、ページをリロードするたびにインデックスから範囲外のエラーが発生します。 – user7780338

+0

* tableView *をリロードすることを意味しますか?そして、どの行にエラーが発生していますか? – Jay

答えて

0

あなたの完了ハンドラ(あなたgetData()方法で、すなわち、1)内tableView.reloadData()を追加する必要があります。

方法ドキュメント:

コールこの方法は、そうで細胞、セクションヘッダーとフッター、索引アレイを含むテーブルを構築するために使用され、すべてのデータをリロードします。

+0

まだ何も表示されていません – user7780338

+0

@ user7780338あなたの 'もしlet price = ...'が奇妙に見えます。もしlet price = snapshot.value asとすればいいのではないでしょうか? Int'?ランタイムエラーが発生していませんか? –

+0

ランタイムエラーは発生しません。getData()関数の最後で配列がnilであるため、セルに値を設定できない場合を除き、すべて正常に動作します。 – user7780338

関連する問題