我想在dequeueReusableCell中获取Firestore数据

时间:2018-12-20 14:10:08

标签: swift uitableview google-cloud-firestore

我重写了所有文本,现在我得到了想要实现的代码。 它不能显示在tableCell上,并且布局也折叠。很抱歉,我编写的代码和正文不够详细。

guard让userID = Auth.auth()。当前用户? .uid我想始终与其他{return}一起获得userID。

//保护let docSnapshot = querySnapshot,document.exists其他{返回}

由于发生错误,因此将其注释掉。

在UIViewController的viewidLoad中

var profDict:[ProfDic] = []在UIViewController中。

profUIView已添加到UIViewController。

    func getFirebaseData() {

         db = Firestore.firestore()

        guard let userID = Auth.auth().currentUser?.uid else {return}


        let ref = db.collection("users").document(userID)

        ref.getDocument{ (document, error) in

            if let document = document {
//                guard let docSnapshot = querySnapshot, document.exists else {return}
                if let prof = ProfDic(dictionary: document.data()!) {

                    self.profDict.append(prof)

                    print("Document data \(document.data())")
                }
            }else{
                print("Document does not exist")
            }

            self.profUIView.tableView1.reloadData()
        }

    }

tableView1已添加到ProfUIView。

class ProfUIView: UIView, UITableViewDelegate, UITableViewDataSource {

        //omission...

            override init(frame: CGRect) {
                super.init(frame: frame)

                backgroundColor = .blue

                addSubview(tableView1)
                tableView1.anchor(top:  //omission...

                 sections = [
                    Section(type: .prof_Sec, items: [.prof]),
                    Section(type: .link_Sec, items: [.link]),
                    Section(type: .hoge_Sec, items: [.hoge0])
                ]

                tableView1.register(TableCell0.self, forCellReuseIdentifier: TableCellId0)                  
                tableView1.register(TableCell3.self, forCellReuseIdentifier: TableCellId3)                    
                tableView1.register(TableCell5.self, forCellReuseIdentifier: TableCellId5)    



                tableView1.delegate = self
                tableView1.dataSource = self

             }

             var tableView1:UITableView = {
                 let table = UITableView()
                 table.backgroundColor = .gray
                 return table
             }()

             //omission                

             func numberOfSections(in tableView: UITableView) -> Int {
                  return sections.count
             }

             func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                  return (baseVC?.profDict.count)!//sections[section].items.count
             }                        

             func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {                            
                switch sections[indexPath.section].items[indexPath.row] {                                
                   case .prof:
                       let cell0 = tableView.dequeueReusableCell(withIdentifier: TableCellId0, for: indexPath) as? TableCell0                                
                       cell0?.nameLabel.text = baseVC?.profDict[indexPath.row].userName 
                       return cell0!
               }

              //omission...   
            }   
        }

附加说明

import Foundation
import FirebaseFirestore

struct ProfDic {

    var userName :String

    var dictionary:[String:Any] {
        return
            ["userName" : userName

        ]
    }

}


extension ProfDic {

    init?(dictionary:[String:Any]) {

        guard let userName = dictionary["userName"] as? String
        else {return nil}

        self.init(userName: userName as String)

    }

}

enter image description here

1 个答案:

答案 0 :(得分:0)

首先创建一个ProfDic元素的空数组:

var profDict: [ProfDic] = []

然后创建一个函数来加载您的Firebase数据:

func getFirebaseData() {

    db = Firestore.firestore()
    let userRef = db.collection("users").getDocuments() {
        [weak self] (querySnapshot, error) in
        for document in querySnapshot!.documents {
            guard let docSnapshot = docSnapshot, docSnapshot.exists else {return}

            if let prof = ProfDic(dictionary: docSnapshot.data()!) {
                profDict.append(prof)
            }
        }
    tableView.reloadData()
    }
}

调用此功能in viewDidLoadviewDidAppear

然后在tableView cellForRowAt中,您像这样访问数据:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch sections[indexPath.section].items[indexPath.row] {
    case .prof:
        let cell = tableView.dequeueReusableCell(withIdentifier: TableCellId, for: indexPath) as? TableCell
        cell?.nameLabel.text = profDict[indexPath.row].userName
        return cell!
    }
}

编辑: 也在numberOfRowsInSection中:

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