UISearchBar需激活输入才返回结果 UITableView首次加载为空如何解决
问题根因
- Firebase的
addSnapshotListener是异步回调逻辑,你在viewDidLoad中调用loadMessages()后立刻执行filteredMessages = messages时,远程数据还未返回,messages是空数组,因此filteredMessages初始值为空,TableView首次读取数据源时行数为0,所以展示空行。 - 当你触发UISearchBar的输入回调时,远程请求已经完成,
messages已经被赋值为加载到的数据源,此时filteredMessages会被正确更新,所以后续操作都能正常展示。
修复方案
只需要在loadMessages方法的异步回调里,排序完成后同步更新filteredMessages的值即可,修改后的代码如下:
func loadMessages() { let user = Auth.auth().currentUser?.email let docRef = db.collection(K.FStore.collectionName).document(user!) docRef.addSnapshotListener { (querySnapshot, error) in self.messages = [] if let e = error { print(e) } else { if let snapshotDocuments = querySnapshot?.data(){ for item in snapshotDocuments { if let key = item.key as? String, let translate = item.value as? String { let newMessage = Message(key: key, value: translate) self.messages.append(newMessage) } } DispatchQueue.main.async { [self] in self.messages.sort(by: {$1.key > $0.key}) // 新增这一行,同步更新过滤数据源 self.filteredMessages = self.messages self.tableView.reloadData() } } } } }
修改完成后,首次加载数据时filteredMessages会和messages同步更新,TableView会正常渲染数据,无需额外操作搜索框。
可选优化
可以删除viewDidLoad中的filteredMessages = messages代码,这行代码在异步场景下没有实际作用。
内容的提问来源于stack exchange,提问作者Helga
相关产品推荐
相关产品推荐

