在我的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
}
答案 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
数据源,还可以轻松找到按下哪个单元格。