Я пытаюсь сделать пользовательскую ячейку в табличном представлении, но ничего не показывало - PullRequest
0 голосов
/ 26 апреля 2019

Как было сказано в заголовке, я пытаюсь создать 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 ]

2 голосов
/ 26 апреля 2019

Вам нужно перезагрузить, поскольку вызов firebase асинхронный

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

Также подумайте, нужно ли вам ref.observe(.value) или ref.observeSingleEvent(of:.value)

0 голосов
/ 26 апреля 2019

Добавьте следующий блок 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 ?? []

Примечание избегать опционального развертывания с использованием !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...