2017-01-24 10 views
0

Я потратил около 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() 
    } 

} 
+0

можно удалить, только если условие из «SearchBar: textDidChange» метод и searchbar.text = «» добавить эту строку в «методе searchBarCancelButtonClicked», ваша проблема была решена. – Vivek

+0

Если вы хотите получить больше разъяснений, добавьте свой код контроллера всех представлений, я предложу, что не так в вашем коде – Vivek

ответ

1

Попробуйте перезагрузить tableView также после установки searchActive к false методам searchBarTextDidEndEditing, searchBarCancelButtonClicked и searchBarSearchButtonClicked.

Примечание: Не устанавливайте searchActive к true методам searchBarTextDidBeginEditing, потому что если вы записали на searbar и ничего не вводить и пытаться прокручивать то и вы получите индекс из ограничивающей аварии.

Редактировать: Проверьте, правильно ли установлен numberOfRowsInSection или нет.

func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int { 
    if searchActive { 
     return filtered.count 
    } 
    return notes.count 
} 
+0

Пожалуйста, проверьте отредактированный ответ. –

+0

Я попытался добавить это, но он все еще кажется ошибкой. Кажется, что, когда я ввожу текст, который он набирает, например, одно слово «note.name» равно «test». а второй «note.name» равен «text», я могу ввести «te», но как только я вхожу в «s», пытаясь напечатать «test», он выдает ошибки – user1881482

+0

@ user1881482 Проверьте мой отредактированный ответ один раз. –

 Смежные вопросы

  • Нет связанных вопросов^_^