FireStore Swift:访问计数和文档详细信息以在表中使用

时间:2019-03-06 04:47:42

标签: swift firebase google-cloud-firestore

在我的TableViewController的viewDidLoad部分中调用时,来自FireStore Swift 4 : How to get total count of all the documents inside a collection, and get details of each document?的代码已正确打印到控制台。但是,我尝试使用“ count”作为行数,并挑选出一些文档详细信息以显示在表中。

我现在遇到的问题是这些详细信息似乎已在此QuerySnapshot调用中锁定,并且无法在numberOfRowsInSection和CellForRowAt中访问它们。我正在使用xcode的版本10。抱歉,这是一个菜鸟问题,但是我已经困扰了一段时间。

var count = 0
override func viewDidLoad() {
    super.viewDidLoad()

    let reviewTopic = Firestore.firestore().collection("usersIds").document(userEmail!).collection("reviews")
    reviewTopic.getDocuments() {
        (QuerySnapshot,err) in

        if let err = err {
            print("Error getting documents: \(err)");
        } else {
            for document in QuerySnapshot!.documents {
                self.count += 1
                print("\(document.documentID) => \(document.data())");
            }
            print("Count = \(self.count)"); 
        }
        print("Count from viewDidLoad: ", self.count) // prints 2
    }
}

同样,上面的代码返回正确的计数(2)和文档详细信息,但是我试图使用numberOfRowsInSection中的值,该值在viewDidLoad之前运行并返回0。

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print("Count from numrows: ", self.count)
    return self.count //returns value of 0
}

1 个答案:

答案 0 :(得分:0)

从服务器获取数据后,您忘记重新加载 <html> <head> <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script> <script src="http://cdn.ckeditor.com/4.5.4/standard/ckeditor.js"></script> </head> <body> <div class="row hide_mail_id_domain"> <div class="col-sm-12"> <table class="table"> <thead> <tr> <th>Option</th> <th>Action</th> </tr> </thead> <tbody> <tr> <td> <textarea class="ckeditor" required="" name="question_option_1" ></textarea> </td> <td></td> </tr> </tbody> </table> <a href="javascript:void(0)" class="btn btn-success add_more right" style="float: right;">Add More</a> </div> </div> <script> var REMOVE = ''; var i=1; $(document).ready(function () { $('.add_more').click(function () { var oneplus=i+1; var tr_object = $('tbody').find('tr:first').clone(); // getting and renaming existing textarea by name. $(tr_object).find('textarea[name="question_option_1"]').attr("name", "question_option_"+oneplus+""); $(tr_object).find('input').val(''); $(tr_object).find('td:last').html('<a href="javascript:void(0)" class="btn btn-danger remove_more">Remove</a>'); $('tbody').append(tr_object); //replace code CKEDITOR.replace("question_option_"+oneplus+""); // when i were clicking on add more during my testing , then extra cke-editor id also appending to DOM. so for removing other then first // included below code $('#cke_question_option_1').each(function() { var $ids = $('[id=' + this.id + ']'); if ($ids.length > 1) { $ids.not(':first').remove(); } }); i=i+1; oneplus++; }); $(document).on('click', '.remove_more', function () { var id = $(this).closest('tr').find('.id').val(); if (id != '') { if (REMOVE != '') { REMOVE = REMOVE + ',' + id; } else { REMOVE = id; } $('#id').val(REMOVE); } $(this).closest('tr').remove(); }); }); </script> </body> </html> ,因此需要使用以下方法重新加载UITableView

UITableView

self.tableView.reloadData() 循环之后。因为这是一个异步调用,您需要等待直到从服务器获取数据。

您的代码将如下所示:

for

还有一件事情,您应该创建一个类对象,并将所有数据存储到一个类对象中,然后将该数据访问到您的override func viewDidLoad() { super.viewDidLoad() let reviewTopic = Firestore.firestore().collection("usersIds").document(userEmail!).collection("reviews") reviewTopic.getDocuments() { (QuerySnapshot,err) in if let err = err { print("Error getting documents: \(err)"); } else { for document in QuerySnapshot!.documents { self.count += 1 print("\(document.documentID) => \(document.data())"); } print("Count = \(self.count)"); self.tableView.reloadData() } print("Count from viewDidLoad: ", self.count) // prints 2 } } cellforrow方法中。或者,您可以使用numberofrows协议从服务器解析Codable并存储服务器数据。

借助它,您可以轻松管理JSON数据源,还可以轻松找到按下哪个单元格。