2017-11-13 8 views
0

Firbaseから正しくデータを出力できません。私は何時間も費やして、これを行うさまざまな方法を試みました。異なるデータ構造などを作成しましたが、私はいつもクラッシュまたはゼロ出力を得ていました。私の現在のコードは動作しており、firebaseからテーブルビューにデータを出力していますが、配列が整列しておらず、特定のユーザのフィールドのフィールドが他のフィールドと関連していないので正しくありません。Firebase/Swift - Firebaseからのデータ出力が間違っていました

これを行うためのより良い方法ですので、これを使って正しい方向に何か助けや指摘があれば大いに感謝します。また、私に簡単にアクセスしてください、私はこれを知っていたよ:)

これは私のfirebase構造である:

これは私のレンタルモデルである:

struct RentalObjects { 

    var title: [String : AnyObject] = [:] 
    var rentalType: [String : AnyObject] = [:] 
    var dateAval: [String : AnyObject] = [:] 
    var location: [String : AnyObject] = [:] 
    var price: [String : AnyObject] = [:] 
    var bond: [String : AnyObject] = [:] 
    var pets: [String : AnyObject] = [:] 
    var descripton: [String : AnyObject] = [:] 

} 

これは私ですテーブルビューに出力するVCのコード:

import UIKit 
import FirebaseDatabase 


class RentalTableViewVC: UIViewController, UITableViewDataSource, UITableViewDelegate{ 

    @IBOutlet weak var rentalImage: UIImageView! 
    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet weak var rentalTitle: UILabel! 
    @IBOutlet weak var rentalPrice: UILabel! 


    var rentalsObject = RentalObjects() 
    var databaseRef:DatabaseReference? 
    var handle: DatabaseHandle? 

    var arrayOfTitles = [String?]() 
    var arrayOfBond = [String?]() 



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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 

     for (_, value) in rentalsObject.title { 
      arrayOfTitles.append(value as? String) 

     } 

     for (_, value) in rentalsObject.bond { 

      arrayOfBond.append(value as? String) 

     } 


     cell.textLabel?.text = ("Title: \(String(describing: arrayOfTitles[indexPath.row]!)), Bond: \(String(describing: arrayOfBond[indexPath.row]!))") 



     return cell 
    } 


    @IBAction func backPressed(_ sender: Any) { 
     dismiss(animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 


     databaseRef = Database.database().reference().child("Rentals") 
     databaseRef?.observe(DataEventType.value, with: { (snapshot) in 

      for rentals in snapshot.children.allObjects as! [DataSnapshot] { 





     switch rentals.key { 

       case "title" : 
        let titleObj = rentals.value as! [String : AnyObject] 

        self.rentalsObject.title = titleObj 

       case "rentalType": 
        let rentalTypeObj = rentals.value as! [String : AnyObject] 
        self.rentalsObject.rentalType = rentalTypeObj 

       case "dateAval": 
        let dateAvalObj = rentals.value as! [String : AnyObject] 
        self.rentalsObject.dateAval = dateAvalObj 
       case "location": 
        let locationObj = rentals.value as! [String : AnyObject] 
        self.rentalsObject.location = locationObj 

       case "price" : 
        let priceObj = rentals.value as! [String : AnyObject] 
        self.rentalsObject.price = priceObj 

       case "bond" : 
        let bondObj = rentals.value as! [String: AnyObject] 
        self.rentalsObject.bond = bondObj 

       case "pets" : 
        let petsObj = rentals.value as! [String: AnyObject] 
        self.rentalsObject.pets = petsObj 

       case "description": 
        let desObj = rentals.value as! [String: AnyObject] 
        self.rentalsObject.descripton = desObj 

       default: 
        break 

       } 

      } 
      self.tableView.reloadData() 
     }) 

    } 

} 

答えて

0

使用.childAdded代わりに.value。 ChildAddedは各オブジェクトを取得し、Valueはすべてのオブジェクトを取得します。 for-loopsは 'cellForRowAr'メソッドから削除する必要があります。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 

     cell.textLabel?.text = ("Title: \(String(describing: arrayOfTitles[indexPath.row]!)), Bond: \(String(describing: arrayOfBond[indexPath.row]!))") 

     return cell 
} 



override func viewDidLoad() { 
    super.viewDidLoad() 

    databaseRef = Database.database().reference().child("Rentals") 
    databaseRef?.observe(.childAdded, with: { (snapshot) in 

     if let dictionary = snapshot.value as? [String: AnyObject] { 

      switch snapshot.key { 

      case "title" : 
      _ = dictionary.map{self.arrayOfTitles.append($0.value as? String)} 
      case "rentalType": 

      case "dateAval": 

      case "location": 

      case "price" : 

      case "bond" : 
      _ = dictionary.map{self.arrayOfBond.append($0.value as? String)} 
      case "pets" : 

      case "description": 

      default: 
       break 
      } 
     } 
    }) 
    self.tableView.reloadData() 
} 
+0

こんにちはa.afanasiev、IVEは今、この作業を取得するために管理が、私は私の以前のコードで以前と同じ問題を抱えています。配列からの出力は、それらがお互いに整列しないようにする何か変なことをしているように見えます。以下のコードを読みやすくするために別の質問に投稿しました。 –

+0

こんにちはa.afanasiev、iveはこれを今すぐ利用することができましたが、以前のコードと同じ問題が発生しています。配列からの出力は、それらがお互いに整列しないようにする何か変なことをしているように見えます。 ViewDidLoad関数内から配列を印刷すると正しいと思われますが、ラベルに出力したり、cellForRowAt関数内から印刷すると配列は重複して見えます。なぜそれが起こるのだろうか? –

+0

'numberOfRowsInSection'メソッドで何を返すのですか? rentalsObject.title.countまたはarrayOfTitles.count? –

関連する問題