[英]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.