Как обновить результаты при нажатии Backspace в UISearchBar? - PullRequest
0 голосов
/ 15 апреля 2019

Я новичок в Swift и Xcode.У меня есть UITableview со списком предметов и UISearchBar.Я хочу, чтобы список фильтровался при каждом добавлении или удалении письма из текстового поля UISearchBar.

Все работает при наборе букв, но с кодом, который у меня есть, я не могу получить список, который возвращает некоторые элементы при удалении некоторых букв, пока текстовое поле не станет пустым ивесь список называется.


func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        self.view.endEditing(true)
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchBar.text?.count == 0 {
            loadListOfExercises()

            DispatchQueue.main.async {
                searchBar.resignFirstResponder()
            }
        }
        else {
            listOfExercises = listOfExercises?.filter("nameOfExercise CONTAINS[cd] %@", searchBar.text!).sorted(byKeyPath: "nameOfExercise", ascending: true)            
            self.listTableView.reloadData()
        }
    }

Это код, который у меня есть для loadListOfExercises ()

func loadListOfExercises() {

        listOfExercises = realm.objects(ExerciseInList.self)

        self.listTableView.reloadData()

    }

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Ошибка здесь в том, что вы вызываете метод фильтра для вашей коллекции и присваиваете его той же коллекции, например так:

listOfExercises = listOfExercises?.filter("nameOfExercise CONTAINS[cd] %@", searchBar.text!).sorted(byKeyPath: "nameOfExercise", ascending: true)

При следующем вызове функции (т. Е. При нажатии клавиши Backspace)Вы фильтруете новый, отфильтрованный список снова.Вам необходимо либо напрямую запросить область

listOfExercises = realm.objects(Exercise.self).("nameOfExercise CONTAINS[cd] %@", searchBar.text!)

, либо, в качестве альтернативы, сохранить экземпляр исходного списка в своем классе и запросить его.

0 голосов
/ 15 апреля 2019

См. Ниже код для определения возврата

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {        
    if searchBar.text?.count == 0 {
        loadListOfExercises()
        self.listTableView.reloadData()
        DispatchQueue.main.async {
            searchBar.resignFirstResponder()
        }
    }else {
        listOfExercises = listOfExercises?.filter("nameOfExercise CONTAINS[cd] %@", searchBar.text!).sorted(byKeyPath: "nameOfExercise", ascending: true)
        self.listTableView.reloadData()
    }

    if let char = searchText.cString(using: String.Encoding.utf8) {
        let isBackSpace = strcmp(char, "\\b")
        if (isBackSpace == -92) {
            print("Backspace was pressed")
            //Reload Your data here
        }
    }
}
...