Firebase到Tableview问题

时间:2017-09-25 18:31:19

标签: ios uitableview firebase database-design

我遇到问题从firebase获取数据以显示在我的TableView上。我只希望vin号显示在表格视图上。现在我要么得到显示" nil"的细胞,要么在细胞中没有任何东西。

我的目标是让每个单元格显示Vin编号。

有人可以看看,让我知道我的问题在哪里吗?

谢谢! 亚历

这是我的firebase数据库的样子

孩子 - 车辆

子 - 5UXKR0C34H0X82785

child-- VehicleInfo 然后根据"车辆信息"它显示这三个字段

使:"丰田"

模型:"花冠"

VinNumber:" 5UXKR0C34H0X82785"

这是我的车辆模型类

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

这是我的视图控制器代码

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

此外,我在通过segue连接的另一个视图控制器中显示所选单元格的品牌和型号时遇到问题。我试图设置传递值但无法使其工作。

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            

    }
}

1 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我,但这是你的数据结构,对吗?

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

这意味着为了访问VehicleInfo下的数据,您需要指定该位置。有几种方法可以做到这一点,但其中一种方法是使用childSnapshot(forPath:)

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