У меня есть TextField, который работает как SearchView, а затем мой TableView показывает мои результаты. Прототип ячейки TableView состоит из двух меток. Первый ярлык заполняется schoolNameArray. Второй ярлык заполняется schoolTownArray + "," + schoolCountryArray. Все 3 массива заполняются через Firebase. Изображение функции поиска показано ниже.
Без второй метки я могу отфильтровать только один массив. Моя проблема в том, что я могу создать фильтр SearchView только для одного массива, а не для трех. Например, я печатаю «Академия» и «Азхарская академия», но если я набираю «Болтон», я получаю «Неустранимая ошибка: индекс выходит за пределы диапазона», потому что я не смог правильно заполнить фильтруемый фильтрSchoolLocationArray.
Моя Android версия проекта извлекает текст из поля поиска, а затем обрабатывает фильтрацию в пределах для l oop запроса firebase. Как я могу сделать это (или достичь того же результата) здесь, используя следующий код:
class SearchViewController: UIViewController {
@IBOutlet weak var editTextSearch: UITextField!
@IBOutlet weak var tableViewSearch: UITableView!
var schoolNameArray = [String]()
var schoolTownArray = [String]()
var schoolCountryArray = [String]()
var filteredSchoolNameArray = [String]()
var filteredSchoolLocationArray = [String]()
var searching = false
override func viewDidLoad() {
super.viewDidLoad()
let schoolDatabase = Database.database().reference().child("Timetable")
schoolDatabase.observeSingleEvent(of: .value, with: { (snapshot) in
for child in snapshot.children {
let schoolID = child as! DataSnapshot
let stringApproved = schoolID.childSnapshot(forPath: "Approved").value
if stringApproved as? String == "Yes" {
let stringSchoolName = schoolID.childSnapshot(forPath: "Name").value as! String
let stringSchoolTown = schoolID.childSnapshot(forPath: "Town or City").value as! String
let stringSchoolCountry = schoolID.childSnapshot(forPath: "Country").value as! String
self.schoolNameArray.append(stringSchoolName)
self.schoolTownArray.append(stringSchoolTown)
self.schoolCountryArray.append(stringSchoolCountry)
}
}
self.tableViewSearch.reloadData()
})
}
}
extension SearchViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searching {
return filteredSchoolNameArray.count
} else {
return schoolNameArray.count
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let searchItem = tableView.dequeueReusableCell(withIdentifier: "SearchItem") as! SearchItemCell
searchItem.searchItemSchoolName.text = schoolNameArray[indexPath.row]
searchItem.searchItemSchoolLocation.text = schoolTownArray[indexPath.row] + ", " + schoolCountryArray[indexPath.row]
if searching {
searchItem.searchItemSchoolName.text = filteredSchoolNameArray[indexPath.row]
searchItem.searchItemSchoolLocation.text = filteredSchoolLocationArray[indexPath.row]
} else {
searchItem.searchItemSchoolName.text = schoolNameArray[indexPath.row]
searchItem.searchItemSchoolLocation.text = schoolTownArray[indexPath.row] + ", " + schoolCountryArray[indexPath.row]
}
return searchItem
}
}
extension SearchViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
filteredSchoolNameArray = schoolNameArray.filter({$0.lowercased().contains((textField.text?.lowercased())!)})
searching = true
tableViewSearch.reloadData()
return true
}
}