2017-11-13 3 views
0

Ich habe ein Problem bei der korrekten Ausgabe von Daten aus Firebase. Ich habe viele Stunden damit verbracht und viele verschiedene Möglichkeiten ausprobiert, um verschiedene Datenstrukturen zu erstellen, aber ich würde immer einen Crash oder Null-Output bekommen. Mein aktueller Code arbeitet und gibt Daten aus Firebase in eine Tabellenansicht aus, aber die Arrays sind fehlausgerichtet und die Felder in einem Array für einen bestimmten Benutzer beziehen sich nicht auf den anderen.Firebase/Swift - Daten aus Firebase fehlerhaft ausgeben

Ich stelle mir das vor ist eine bessere Möglichkeit, dies zu tun, so dass jede Hilfe oder ein Punkt in die richtige Richtung mit diesem würde sehr geschätzt werden. bitte auf mich gehen auch einfach, ich bin auf diese wusste :)

Das ist mein Feuerbasis Struktur:

Das ist mein WG-Modell:

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] = [:] 

} 

Das ist mein Code für die VC-Ausgabe an die Tabellenansicht:

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

    } 

} 

Antwort

0

Verwenden Sie .childAdded stattdessen .Wert. ChildAdded ruft jedes Objekt ab, während Value alle Objekte abruft. Sie sollten for-Schleifen aus der 'cellForRowAr'-Methode entfernen.

+0

Hallo a.afanasiev, ich habe es geschafft, das jetzt funktioniert, aber ich habe das gleiche Problem wie zuvor mit meinem vorherigen Code. Die Ausgabe der Arrays scheint etwas Seltsames zu tun, was dazu führt, dass sie zueinander falsch ausgerichtet werden. Ich habe meinen Code unten in einer anderen Frage zur leichteren Lesbarkeit gepostet. –

+0

Hallo a.afanasiev, ich habe es geschafft, das jetzt funktioniert, aber ich habe das gleiche Problem wie zuvor mit meinem vorherigen Code. Die Ausgabe der Arrays scheint etwas Seltsames zu tun, was dazu führt, dass sie zueinander falsch ausgerichtet werden. Wenn ich die Arrays aus der Function ViewDidLoad drucke, erscheinen sie korrekt. Wenn ich sie jedoch über die Funktion cellForRowAt an die Beschriftung oder den Ausdruck ausgabe, erscheinen die Arrays doppelt. Irgendwelche Ideen, warum das passieren würde? –

+0

Was geben Sie bei der Methode 'numberOfRowsInSection' zurück? rentsObject.title.count oder arrayOfTitles.count? –