2017-09-25 3 views
0

Ich habe Probleme, meine Daten von Firebase auf meinem TableView anzuzeigen. Ich möchte nur die Vin-Nummer in der Tabellenansicht anzeigen. Im Moment bekomme ich entweder Zellen, die "Null" oder nichts in den Zellen anzeigen.Firebase zu Tableview Ausgabe

Mein Ziel ist es, dass jede Zelle die Vin-Nummer anzeigt.

Kann jemand einen Blick darauf werfen und mich wissen lassen, wo ich ein Problem habe?

Danke !!! Alex

hier ist das, was meine Feuerbasis Datenbank sieht aus wie

Kind --Vehicles

Kind - 5UXKR0C34H0X82785

child-- zum Auto dann unter dem "Fahrzeug Info" Kind es diese zeigt drei Felder

machen: "toyota"

Modell: "coro lla“

VinNumber: "5UXKR0C34H0X82785"

Hier ist meine Fahrzeugmodellklasse

import Foundation 
import FirebaseDatabase 

struct VehicleModel { 
var Make: String? 
var Model: String? 
var VinNumber: String? 

init(Make: String?, Model: String?, VinNumber: String?){ 
    self.Make = Make 
    self.Model = Model 
    self.VinNumber = VinNumber 
} 

    init(snapshot: DataSnapshot) { 
    let snapshotValue = snapshot.value as! [String: AnyObject] 
    VinNumber = snapshotValue["VinNumber"] as? String 
    Make = snapshotValue["Make"] as? String 
    Model = snapshotValue["Model"] as? String 
    } 
} 

Hier ist meine Ansicht Controller-Code

import UIKit 
import Firebase 
import FirebaseDatabase 
class InventoryTableViewController: UITableViewController{ 


    var ref: DatabaseReference! 
    var refHandle: UInt! 
    var userList = [VehicleModel]() 

    let cellId = "cellId" 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    ref = Database.database().reference() 

    tableView.delegate = self 
    tableView.dataSource = self 

    tableView?.register(UITableViewCell.self, forCellReuseIdentifier: 
    "cellId") 
    fetchUsers() 
} 

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
IndexPath) -> UITableViewCell { 
    // Set cell contents 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: 
indexPath) as UITableViewCell 
    let eachvehicle = userList[indexPath.row] 
    cell.textLabel!.text = "\(String(describing: eachvehicle.VinNumber))" 
    return cell 
} 

func fetchUsers(){ 
      refHandle = ref.child("Vehicles").observe(.childAdded, with: { 
(snapshot) in 
      if let dictionary = snapshot.value as? [String: AnyObject] { 
      print(dictionary) 
      let VinNumber = dictionary["VinNumber"] 
      let Make = dictionary["Make"] 
      let Model = dictionary["Model"] 
      self.userList.insert(VehicleModel(Make: Make as? String, Model: 
Model as? String, VinNumber:   VinNumber as? String), at: 0) 
      self.tableView.reloadData()    
     } 
    }) 
    } 
} 

Auch ich Fragen habe das Make Anzeige und Modell der ausgewählten Zelle in einem anderen Ansichtscontroller, der durch ein Segment verbunden ist. Ich habe versucht, die Werte zu übergeben, kann sie aber nicht zum Laufen bringen.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: 
IndexPath) { 
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) 
    let destination = storyboard.instantiateViewController(withIdentifier: 
"AdditionalInfoViewController") as! AdditionalInfoViewController 
    navigationController?.pushViewController(destination, animated: true) 
    performSegue(withIdentifier: "toAdditionalInfo", sender: self) 
     let row = indexPath.row 
     print("working so far ") 

    let indexPath = tableView.indexPathForSelectedRow! 
    let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell 
    makeToPass = currentCell.Model 
    modelToPass = currentCell.Make  
} 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "toMapView" { 
     var viewController = segue.destination as! AdditionalInfoViewController 
     viewController.makeToPass = makeValueToPass 
     viewController.modelToPass = modelValueToPass    

    } 
} 

Antwort

1

Korrigieren Sie mich, wenn ich falsch liege, aber das ist Ihre Datenstruktur, richtig?

Vehicles: { 
    5UXKR0C34H0X82785: { 
     VehicleInfo: { 
      make:"toyota", 
      model:"corolla", 
      VinNumber: "5UXKR0C34H0X82785" 
     } 
    } 
} 

Welche Mittel, um die Daten unter VehicleInfo zugreifen zu können, müssen Sie diesen Speicherort angeben. Es gibt ein paar Möglichkeiten, wie Sie dies tun können, aber einer von ihnen würde verwenden childSnapshot(forPath:)

+0

Dank Jen !!!! Das hat funktioniert! Du bist toll!!!!!!! – Alex

+0

Froh, dass es geholfen hat! Beachten Sie bitte, dass wenn Sie neben "VehicleInfo" weitere Daten unter den Push-IDs unter "Fahrzeuge" haben, diese Daten immer dann herunterladen, wenn ein neues Fahrzeug hinzugefügt wird, unabhängig davon, ob Sie die Daten neben "VehicleInfo" verwenden . Wenn neben 'VehicleInfo' noch andere Daten unter dem Namen' 5UXKR0C34H0X82785' vorhanden sind, sollten Sie vielleicht erneut überdenken, wie der Listener ausgelöst wird oder wie die Datenbank strukturiert ist, sodass Sie nur die Daten herunterladen, die Sie benötigen. –

+0

danke dafür auch zu erwähnen. Ich werde definitiv auf die Datenbank schauen, um zu sehen, ob ich es umstrukturieren kann. Danke noch einmal!!! – Alex