2017-01-18 9 views
0

Firebaseから別のViewControllerに少数のデータしか渡しません。Swift - firebaseから別のViewControllerにデータを渡す(segue)

以下は私のコードです。 何度もテストしましたが、まだ失敗しました。 変数 "limits"が空であることがわかりましたprint(limits) // IT'S EMPTY私は次のViewControllerにデータを正常に渡すことができません。

import UIKit 
import Firebase 
import FirebaseDatabase 

struct limitStruct{ 
    let name : String! 
    let today : String! 
    let limit : String! 

} 

class CalcViewController: UITableViewController { 

    var limits = [limitStruct]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     navigationController?.navigationBar.barTintColor = UIColor.black 
     self.title = "Calculation" 
     navigationController!.navigationBar.titleTextAttributes = 
      [NSForegroundColorAttributeName: UIColor.white] 
     let databaseReference = FIRDatabase.database().reference() 

     databaseReference.child("Limit").queryOrderedByKey().observe(.childAdded, with: { 
      snapshot in 
      var snapshotValue = snapshot.value as? NSDictionary 

      let name = snapshotValue!["name"] as? String 
      snapshotValue = snapshot.value as? NSDictionary 

      let today = snapshotValue!["today"] as? String 
      snapshotValue = snapshot.value as? NSDictionary 

      let limit = snapshotValue!["limit"] as? String 
      snapshotValue = snapshot.value as? NSDictionary 

      self.limits.insert(limitStruct(name:name, today:today, limit: limit), at: self.limits.count) 
      self.tableView.reloadData() 
     }) 

    print(limits) // IT'S EMPTY 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

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

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

     let cell = tableView.dequeueReusableCell(withIdentifier: "Limit") 

     let label1 = cell?.viewWithTag(1) as! UILabel 
     label1.text = limits[indexPath.row].name 

     let label2 = cell?.viewWithTag(2) as! UILabel 
     label2.text = limits[indexPath.row].today 

     return cell! 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "showDetails"{ 

      let svc = segue.destination as! CirSliderViewController; 

      if let indexPath = self.tableView.indexPathForSelectedRow{ 

       let segueData : limitStruct 
       segueData = limits[indexPath.row] 

       svc.RsegueData = segueData 

      } 

     } 
    } 
} 
+0

非同期タスクについてGoogleで検索する必要があります。 –

答えて

1

databaseReference.child("Limit").queryOrderedByKey().observe()は非同期的にコードブロックを実行します。これは、print(limits)が呼び出されたときにまだ実行されていない場合、制限が空であることを意味します。

+0

データを別の変数に保存して使用する方法はありますか? – jlassap

+0

最初のprint()が空であること以外に、他に何か問題はありますか?残りのコードは妥当であるようです。あなたはobserve-blockにブレークポイントを設定して、いつ – mlidal

+0

と呼ばれるのかを見て、セルから直接コンテンツを読むことができますか? – jlassap

関連する問題