就像标题说的那样,我正在尝试使用自定义单元格制作一个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编程的新手,所以这可能是一个愚蠢的错误,我的视图控制器和单元在情节提要中为他们提供了一个自定义类,但表却没有,这是视图控制器中的表。请我真的需要帮助谢谢
答案 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 ?? []
注意避免使用!