我正在尝试在表格视图中创建自定义单元格,但未显示任何内容

时间:2019-04-26 16:51:47

标签: ios swift uitableview

就像标题说的那样,我正在尝试使用自定义单元格制作一个UITableView,所有东西都可以正常工作,使单元格变得好用的数组,它包含元素,但是当您显示应用程序全部时细胞是空的。 这是UIViewController的代码:

import UIKit
import FirebaseAuth
import FirebaseDatabase

class GastosViewController: UIViewController {

    let idUser = Auth.auth().currentUser?.displayName
    var arrayGastos = [Gastos]()

    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        var ref : DatabaseReference
        ref = Database.database().reference().child("Users").child(idUser!).child("Gastos")
        ref.observe(.value) { (snapshot) in
            let value = snapshot.value as? NSDictionary
            for j in value!{ 
                let i = j.value as? NSDictionary
                let titulo = i?["Nombre"] as? String
                let descripcion = i?["Descripcion"] as? String
                let precio = i?["precio"] as? Float
                let fecha = i?["Fecha"] as? String
                let gastoAux = Gastos(titulo: titulo!, descripcion: descripcion!, precio: precio!, date: fecha!)
                print(titulo, descripcion, fecha, precio)
                self.arrayGastos.append(gastoAux)
            }
        }

        // Do any additional setup after loading the view.
    }

}

extension GastosViewController : UITableViewDelegate, UITableViewDataSource {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let fila = arrayGastos[indexPath.row]
        let celda = tableView.dequeueReusableCell(withIdentifier: "CeldaGastos") as! Celda

        celda.setCelda(celda: fila)
        return celda 
    }

}

我相信那是没关系的代码,但是我完全不确定,此外,我将添加代码“ Gastos ”,我将生成的对象添加到其中细胞阵列。

import Foundation
import UIKit

class Gastos {

    var titulo : String
    var descripcion : String
    var precio : Float
    var date : String

    init(titulo : String, descripcion : String, precio : Float, date : String) {
        self.titulo = titulo
        self.descripcion = descripcion
        self.precio = precio
        self.date = date
    }

}

最后就是我的TableViewCell

import UIKit

class Celda: UITableViewCell {

    @IBOutlet weak var Titulo: UILabel!
    @IBOutlet weak var Fecha: UILabel!
    @IBOutlet weak var Precio: UILabel!
    @IBOutlet weak var Descripcion: UILabel!

    func setCelda(celda : Gastos){
        Titulo.text = celda.titulo
        Descripcion.text = celda.descripcion
        Fecha.text = celda.date
        Precio.text = String(celda.precio)
    }

}  

我是Swift编程的新手,所以这可能是一个愚蠢的错误,我的视图控制器和单元在情节提要中为他们提供了一个自定义类,但表却没有,这是视图控制器中的表。请我真的需要帮助谢谢

2 个答案:

答案 0 :(得分:2)

您需要重新加载,因为对Firebase的调用是异步的

self.arrayGastos.append(gastoAux)
}
self.tableView.reloadData()

还要考虑您需要ref.observe(.value)ref.observeSingleEvent(of:.value)

答案 1 :(得分:0)

在数据源中添加以下didSet块,以便在UITableView更改时刷新arrayGastos

var arrayGastos = [Gastos]() {
    didSet {
        self.tableView.reloadData()
    }
}

而不是for-in,请使用以下Array.compactMap

let array = value?.compactMap { j in
    guard let i = j.value as? [String : Any] else { return nil }

    let titulo = i["Nombre"] as? String
    let descripcion = i["Descripcion"] as? String
    let precio = i["precio"] as? Float
    let fecha = i["Fecha"] as? String
    print(titulo, descripcion, fecha, precio)

    return Gastos(titulo: titulo ?? "", descripcion: descripcion ?? "", precio: precio ?? 0, date: fecha ?? "")
}
self.arrayGastos = array ?? []

注意避免使用!

强制展开可选内容