Как обновить результаты поиска UISearchBar при вводе без необходимости нажимать кнопку «Поиск»? Есть ли какой-нибудь родной способ? - PullRequest
0 голосов
/ 13 мая 2019

Я работаю над очень простым приложением, таким как Notes, и у меня есть searchBar.Но каждый раз, когда я хочу выполнить поиск, мне нужно что-то набрать в строке поиска и нажать кнопку «Поиск».Есть ли способ поиска, когда я печатаю?Напечатал один символ - таблица обновилась, напечатал другой - таблица обновилась снова.

Вот так выглядит мое расширение.loadData () - это функция, которая загружает данные из CoreData в tobleView.

extension ViewController: UISearchBarDelegate {

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    let request : NSFetchRequest<Note> = Note.fetchRequest()

    request.predicate = NSPredicate(format: "text CONTAINS[c] %@", searchBar.text!)

    request.sortDescriptors = [NSSortDescriptor(key: "text", ascending: true)]

    loadData(with: request)
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text?.count == 0 {
        getNotes()
        DispatchQueue.main.async {
            searchBar.resignFirstResponder()
        }
    } else {
        self.tableView.reloadData()
    }
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchBar.text = ""
    searchBar.endEditing(true)

    getNotes()
}

Ответы [ 3 ]

0 голосов
/ 13 мая 2019

Будет работать с textDidChange, но у него есть свои недостатки.Например: если пользователь вводит слишком быстро, вы будете запрашивать сервер (если отфильтрованные результаты извлекаются с сервера) или фильтровать массив (если результаты локальные) слишком много раз, когда эти операции фильтрации и запросов не очень важны.потому что пользователь все еще печатает.

Вместо этого вы можете использовать RxSwift.Это удивительная библиотека и служит многим целям.Идея состоит в том, чтобы воспринимать типизацию пользователя как поток событий.Затем, используя RxSwift, вы можете применить некоторую логику к этому потоку событий.Например, сколько ждать следующей операции запроса / фильтрации, чтобы иметь различное значение и многие другие операции.

Посмотрите на этот пример.

0 голосов
/ 13 мая 2019

Я передал код из функции searchBarSearchButtonClicked () в функцию searchBar textDidChange ().Теперь это работает и выглядит так:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text?.count == 0 {
        getNotes()
        DispatchQueue.main.async {
            searchBar.resignFirstResponder()
        }
    } else {
        let request : NSFetchRequest<Note> = Note.fetchRequest()
        request.predicate = NSPredicate(format: "text CONTAINS[c] %@", searchBar.text!)
        request.sortDescriptors = [NSSortDescriptor(key: "text", ascending: true)]

        getNotes(with: request)
        self.tableView.reloadData()
    }
}
0 голосов
/ 13 мая 2019

Я предполагаю, что "getNotes ()" - это метод, которым вы должны запрашивать сохраненные заметки пользователей.Что вы должны / могли бы сделать, это добавить обработчик завершения в getNotes () и параметр, который принимает строку.Используя метод делегата textDidChange (которому вы уже соответствуете), вы можете сделать что-то вроде этого ...

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    guard let txt = searchText.trimmingCharacters(in: .whitespacesAndNewlines), !txt.isEmpty else {return}

    getNotes(searchText: txt) { (results) in
        // Set your data source with new results
        self.src = results
        // Reload collection
        DispatchQueue.main.async {
            self.collectionView.reload()
        }
    }
}
...