#ios #swift #firebase #google-cloud-firestore
#iOS #swift #firebase #google-облако-firestore
Вопрос:
Я хочу реализовать функцию поиска в своем приложении. Я хочу, чтобы, когда пользователь ищет определенный магазин в строке поиска, он выполнял поиск в базе данных firestore и заполнял tableview конкретным магазином, который он ввел.
но я застрял в функции панели поиска и как бы я запросил firestore для извлечения и сохранения текста, который пользователь вводит в строке поиска.
вот мой код до сих пор:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredShops = []
db.collection("Shops").whereField("name", isLessThanOrEqualTo: searchText).addSnapshotListener{ (query, error) in
if error != nil {return}
guard let doucments = query?.documents else {return}
for doc in doucments {
self.sName = doc["name"] as? String
self.sLoc = doc["location"] as? String
self.sImg = doc["ShopHeaderImg"] as? String
self.filteredShops.append(self.sName!)
self.filteredShops.append(self.sLoc!)
self.filteredShops.append(self.sImg!)
}
}
print("is typing")
}
}
extension SearchTableViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredShops.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = searchTV.dequeueReusableCell(withIdentifier: "searchShop")! as UITableViewCell
cell.textLabel?.text = filteredShops[0]
return cell
}
}
как я могу реализовать это с помощью базы данных firestore?
Комментарии:
1. Вы спрашиваете, как запрашивать базу данных или как отображать результат?
2. @Pancho пожалуйста, просмотрите мой отредактированный вопрос, я спрашиваю, как запросить базу данных и отобразить результат правильным образом. приведенный выше метод, который я показываю, не сработал для меня.
Ответ №1:
Ну, вот какой-то псевдокод
Создайте себе что-то, с чем легче работать, чтобы оно служило вам моделью данных
struct Shop {
let name: String?
let location: String?
let image: String?
init(from document: Document) {
name = document["name"] as? String
location = document["location"] as? String
image = document["ShopHeaderImg"] as? String
}
}
Затем в вашем контроллере представления добавьте источник данных
var shops: [Shop] = []
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
db.collection("Shops")
.whereField("name", contains: searchText)
.addSnapshotListener { [weak self] (query, error) in
// make sure you capture self weak as it may lead to memory leak
guard let self = self, let documents = query?.documents else { return }
// simply transform your Documents to Shops and update your dataSource
self.shops = documents.map { Shop(from: $0) }
// Reload your table view and show the result
self.tableView.reloadData()
}
}
}
extension SearchTableViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return shops.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = searchTV.dequeueReusableCell(withIdentifier: "searchShop")! as UITableViewCell
let shop = shops[indexPath.row]
cell.textLabel?.text = shop.name
return cell
}
}
Комментарии:
1. удивительный ответ, теперь он работает. есть ли способ, с помощью которого я могу сделать так, чтобы он начинался с префикса? итак, если пользователь начнет вводить «St», в начале будут отображаться все магазины с префиксом «St»?
2. Взгляните на документацию о том, как запрашивать ее. Я не слишком знаком с firestore