简体   繁体   English

无法在 tableview 上显示来自 firebase 文档的数据

[英]Can't display data from firebase documents on a tableview

I have an array that stores data for a table view, and I need my app to retrieve data from firebase, and then append it into the data array to be displayed onto my table view.我有一个存储表视图数据的数组,我需要我的应用程序从 firebase 检索数据,然后将其附加到数据数组中以显示在我的表视图上。 but for some reason all the cells in the table view are packed together closely after I added the line assignmentstableview.reloadData() .但是由于某种原因,在添加了assignmentstableview.reloadData()行后,表格视图中的所有单元格都紧密地打包在一起。 And when I remove assignmentstableview.reloadData() , the data doesn't show up at all.当我删除assignmentstableview.reloadData() ,数据根本不显示。 Anyone knows how to retrieve data from firebase documents, and then display it on my tableview?任何人都知道如何从 firebase 文档中检索数据,然后将其显示在我的 tableview 上? code is shown below:代码如下所示:

import Firebase
import FirebaseAuth


class AssignmentsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    struct assignmentmodal {
        let name: String
        let duedate: String
        let imagename: String
    }
    
    var data: [assignmentmodal] = []
    
    
    @IBOutlet weak var titleLabel: UILabel!
    
    @IBOutlet weak var titleView: UIView!
    
    
    @IBOutlet weak var plusbtn: UIButton!
    
    @IBOutlet weak var codeLabel: UILabel!
    
    @IBOutlet weak var assignmentstableview: UITableView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        syncAssignments()
        data.append(assignmentmodal(name: "test2", duedate: "test2", imagename: ""))
        titleLabel.text = "\(ClassesViewController.shared.chosenClass)"
        print(ClassesViewController.shared.chosenClass)
        let gradientFirstColor = UIColor(hex: "9d81e0").cgColor
        let gradientSecondColor = UIColor(hex: "6d5cd3").cgColor
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = titleView.bounds
        gradientLayer.colors = [gradientFirstColor, gradientSecondColor]
        gradientLayer.cornerRadius = 21
        gradientLayer.masksToBounds = true
        titleView.layer.insertSublayer(gradientLayer, at: 0)
        displayInfo(classname: ClassesViewController.shared.chosenClass)
        setTableView()
        titleView.layer.cornerRadius = 21
        
        
        // Do any additional setup after loading the view.
    }
    
    @IBAction func unwindsegue(_ sender: Any) {
        print("button works")
        performSegue(withIdentifier: "unwind", sender: self)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        syncAssignments()
    }
    let db = Firestore.firestore()
    let user = Auth.auth().currentUser
    func syncAssignments() {
        db.collection("Classes").document(ClassesViewController.shared.chosenClass).collection("Assignments").getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    if let name = document.get("name"), let duedate = document.get("due date") {
                        print("\(name)")
                        print("\(duedate)")
                        self.data.append(assignmentmodal(name: "\(name)", duedate: "\(duedate)", imagename: ""))
                        self.assignmentstableview.reloadData()
                        self.setTableView()
                    }
                }
            }
        }
    }
    
    func setTableView() {
        assignmentstableview.backgroundColor = UIColor.clear
        assignmentstableview.delegate = self
        assignmentstableview.dataSource = self
        
        assignmentstableview.register(AssignmentCellTableViewCell.self, forCellReuseIdentifier: "Cell")
    }
    
    
    
    
    @IBAction func plusAssignment(_ sender: Any) {
        
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let assignments = data[indexPath.row]
        let cell = assignmentstableview.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! AssignmentCellTableViewCell
        cell.image.image = UIImage(named: assignments.imagename)
        cell.assignmentname.text = assignments.name
        cell.duedate.text = assignments.duedate
        print("\(assignments.name)")
        print("\(assignments.duedate)")
        return cell
    }
    
    func displayInfo(classname: String) {
        let db = Firestore.firestore()
        db.collection("Classes").whereField("name", isEqualTo: classname)
            .getDocuments() { (querySnapshot, err) in
                if let err = err {
                    print("Error getting documents")
                } else {
                    for document in querySnapshot!.documents {
                        if let teacher = document.get("teacher"), let code = document.get("code") {
                            print(code)
                            self.codeLabel.text = "\(code)"
                            
                            let user = Auth.auth().currentUser
                            if let email = user?.email {
                                print("\(email)")
                                let docRef = db.collection("Users").document("limkiran522@gmail.com")
                                docRef.getDocument { (document, error) in
                                    if let document = document, document.exists, let username = document.get("username") {
                                        if username as! String == teacher as! String {
                                            self.plusbtn.isHidden = false
                                        }
                                        else {
                                            self.plusbtn.isHidden = true
                                        }
                                    } else {
                                        print("Document does not existdisplay")
                                    }
                                }
                            }
                        }
                    }
                }
        }
        
    }
    
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */
    
    
    
}

my cell class:我的细胞课:


import UIKit

class AssignmentCellTableViewCell: UITableViewCell {
    
    lazy var backview: UIView = {
        let view = UIView(frame: CGRect(x: 10, y: 6, width: 340, height: 110))
        view.backgroundColor = UIColor.white
        return view
    }()
    
    lazy var image: UIImageView = {
        let image = UIImageView(frame: CGRect(x: 4, y: 15, width: 80, height: 80))
        image.contentMode = .scaleAspectFill
        return image
    }()
    
    lazy var assignmentname: UILabel = {
        let assignmentname = UILabel(frame: CGRect(x: 116, y: 8, width: backview.frame.width - 88, height: 25))
        assignmentname.textAlignment = .left
        assignmentname.font = UIFont.boldSystemFont(ofSize: 20)
        return assignmentname
    }()
    
    lazy var duedate: UILabel = {
        let duedate = UILabel(frame: CGRect(x: 116, y: 42, width: backview.frame.width - 88, height: 25))
        duedate.textAlignment = .left
        duedate.font = UIFont.systemFont(ofSize: 10)
        return duedate
    }()

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    
    override func layoutSubviews() {
        backview.layer.cornerRadius = 15
        backview.clipsToBounds = true
        backview.layer.borderColor = UIColor.systemGray5.cgColor
        backview.layer.borderWidth = 1
        image.layer.cornerRadius = 40
        image.clipsToBounds = true
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        addSubview(backview)
        backview.addSubview(image)
        backview.addSubview(assignmentname)
        backview.addSubview(duedate)
        // Configure the view for the selected state
    }

}

and this is how it looks like when the cells are packed together:这就是细胞被挤在一起时的样子:

在此处输入图片说明

I suggest you switch your calls of self.assignmentstableview.reloadData() and self.setTableView() you need the delegate call before reload the data of the table.我建议您切换self.assignmentstableview.reloadData()self.setTableView()的调用,您需要在重新加载表的数据之前调用委托。

Actually, your function func setTableView() only needs to be called once, and it should be called before self.assignmentstableview.reloadData()实际上,您的函数func setTableView()只需要调用一次,并且应该在self.assignmentstableview.reloadData()之前self.assignmentstableview.reloadData()

If that doesn't work maybe the problem is related to your Firestore.如果这不起作用,则问题可能与您的 Firestore 有关。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM