Я потратил около 3 часов, пытаясь заставить этот UISearchbar работать. У меня есть пользовательский класс Notes
который имеет свойство .name
. Я пытаюсь отфильтровать данные (массив заметок) по свойству .name
. Я реализовал delegate
и создал экземпляр второго фильтрованного массива, а также всех необходимых требований протокола. Однако я не могу заставить функцию поиска возвращать правильные данные. Ниже приведен текущий код, который я использую. Он строит отлично, однако, когда я набираю строку поиска, я получаю сообщение об ошибке index out range
, это происходит в строке ниже с прилагаемым комментарием. Это делается изнутри контроллера представления и контроллера таблицы внутри него.UISearchBar iOS возвращающая ошибка индекса вне диапазона
var notes = [Notes]()
var searchActive : Bool = false
var filtered = [Notes]()
/// these above vars are global ///
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchActive = true;
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
searchActive = false;
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchActive = false;
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchActive = false;
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filtered = notes.filter(){ (Notes) -> Bool in
let range = Notes.name.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
return range != nil
}
if(filtered.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.tableView.reloadData()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var note: Notes
if(searchActive){
//// THIS IS WHERE THE ERROR IS THROWN /////
note = filtered[indexPath.row]
} else {
note = notes[indexPath.row]
}
if let cell = tableView.dequeueReusableCell(withIdentifier: "NoteCell", for: indexPath as IndexPath) as? NoteCell {
cell.configureCell(note: note)
return cell
} else {
return NoteCell()
}
}
можно удалить, только если условие из «SearchBar: textDidChange» метод и searchbar.text = «» добавить эту строку в «методе searchBarCancelButtonClicked», ваша проблема была решена. – Vivek
Если вы хотите получить больше разъяснений, добавьте свой код контроллера всех представлений, я предложу, что не так в вашем коде – Vivek