ios - Swift:如何使用 Firebase 中的数据过滤表格单元格
问题描述
我创建了一个包含 Firebase 数据的表格视图。现在我想添加一个搜索栏来过滤我的数据storeName
。
这是我当前的表视图控制器的外观:
我的数据库如下所示:
我的数据模型(StoreModel):
class StoreModel{
var name: String?
var desc: String?
var url: String?
var rate: Double
init(
name: String?, desc: String?, url: String?, rate: Double){
self.name = name
self.desc = desc
self.url = url
self.rate = rate
}
我如何从 Firebase 获取数据:
var storeList = [StoreModel]()
var refStores: DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
FirebaseApp.configure()
refStores = Database.database().reference().child("stores")
refStores.observe(DataEventType.value, with: {(snapshot) in
if snapshot.childrenCount > 0{
self.storeList.removeAll()
for stores in snapshot.children.allObjects as! [DataSnapshot]{
let storeObject = stores.value as? [String: AnyObject]
let storeName = storeObject?["storeName"]
let storeDesc = storeObject?["storeDesc"]
let storeUrl = storeObject?["storeUrl"]
let storeRate = storeObject?["storeRate"]
let store = StoreModel(
name: storeName as! String?, desc: storeDesc as! String?, url: storeUrl as! String?, rate: storeRate as! Double)
self.storeList.append(store)
}
self.tblSearch.reloadData()
}
})
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ViewControllerTableViewCell
let store: StoreModel
store = storeList[indexPath.row]
cell.labelName.text = store.name
cell.labelDesc.text = store.desc
cell.imageStore.setImage(from: store.url)
cell.imageStore.clipsToBounds = true
cell.imageStore.layer.cornerRadius = 20
cell.imageGrey.clipsToBounds = true
cell.imageGrey.layer.cornerRadius = 20
cell.cosmosView.rating = store.rate
return cell
}
谢谢你的帮助!
解决方案
试试下面的。
import UIKit
import FirebaseDatabase
class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// MARK: - Variables
var refStores: DatabaseReference!
func runSearch(key: String) {
_ = refStores.queryOrdered(byChild: "storeName").queryEqual(toValue: key).observeSingleEvent(of: .value, with: { (dataSnapshot) in
if dataSnapshot.childrenCount > 0 {
for store in dataSnapshot.children.allObjects as! [DataSnapshot] {
let key = store.key
let object = store.value as! [String: Any]
let storeDesc = object["storeDesc"] as! String
let storeUrl = object["storeUrl"] as! String
let storeRate = object["storeRate"] as! Int
let storeModel = StoreModel(...
self.storeList.append(storeModel)
}
}
self.tableView.reloadData()
}, withCancel: {(Err) in
print(Err.localizedDescription)
})
}
推荐阅读
- jenkins - 在 Jenkins 上运行时可以过滤 Allure 注释吗?
- python - 为什么 Ffmpeg boxblur 在非方形区域上工作缓慢?
- c# - 使用异步任务提高 HttpResponseMessage 性能
- python - 我无法在下拉菜单中使用 Selenium 找到下载链接
- qt - 在客户端管理应用程序的 QT 中的服务器客户端
- javascript - 将笛卡尔坐标缩放到平面
- chatbot - 如果它是动态的,如何创建名称实体?
- machine-learning - 保存机器学习模型以用于新数据
- r - 尝试使用 ML 模型作为 R 中的目标函数
- python - 如何定义一个 pandas 数据框以根据存储在 csv 文件中的 id 读取图像?