You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:27:00