2017-09-28 13 views
0

Je rencontre des problèmes lors de l'affichage de la marque et du modèle de la cellule sélectionnée dans un autre contrôleur de vue connecté par un segment. Les cellules affichent le numéro de Vin et je veux que les informations sur la marque et le modèle pour ce numéro vin spécifique soient transmises à un autre ViewController. J'ai essayé de mettre en place les valeurs, mais je n'arrive pas à le faire fonctionner. Est-ce que quelqu'un peut jeter un coup d'oeil et voir si ils peuvent repérer où je me suis trompé?Passage des données Firebase de tableview à ViewController

Voici ce que ma base de données firebase ressemble:

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

Voici mon modèle de véhicule classe

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

Voici mon point de vue code du contrôleur

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.childSnapshot(forPath: 
"VehicleInfo").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()    
     } 
    }) 
    } 
} 

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 = makeToPass 
     viewController.modelToPass = modelToPass    

    } 
} 
Structure

pour les variables mon contrôleur AdditionalInfoView

var passedValue: String? 
    var latitudePassedValue: String? 
    var longitudePassedValue: String? 
+0

Are '' makeToPass' et optionals modelToPass'? Comment sont-ils initialisés dans le prochain VC? Si vous ajoutez des instructions d'impression dans 'prepare (pour segue:)', quelles sont les valeurs de 'makeValueToPass' et de' modelValueToPass'? Dans votre fonction tableView (didSelectRowAt) ', vous affectez' makeToPass = currentCell.Model modelToPass = currentCell.Make 'mais vous utilisez ensuite différents noms de variables dans la section. Voulez-vous dire 'makeToPass' au lieu de' makeValueToPass'? –

+0

Je viens de corriger le "makeValueToPass" et commuté à la "makeToPass" que j'ai assigné dans ma fonction tableView (didSelectRowAt). Je viens d'ajouter la structure de mes variables dans la question aussi. – Alex

Répondre

0

Le problème semble être dans l'analyse des données de la base de données. La structure a make et model minuscules:

// ... 
make:"toyota", 
model:"corolla", 
// ... 

Mais dans la méthode d'analyse que vous vous adressez avec la première lettre en majuscule:

// ... 
Make = snapshotValue["Make"] as? String // "Make" 
Model = snapshotValue["Model"] as? String // "Model" 
// ...