Я пытался реализовать UISearchController в приложении, а в качестве ссылки я следовал this учебнику. Учебник охватывал немного больше, чем мне нужно (например, область), поэтому я только просматривал его, но когда я запускал тестовое приложение, поиск не работал. Когда я набирал строку поиска, она только отфильтровывала результаты для первого введенного мной символа, независимо от того, нажал ли я «поиск» или нет. Например, если я набрал «дельфин», он будет показывать только результаты, содержащие «d». Распечатав внутри updateSearchResultsForSearchController
, я подтвердил, что он был вызван только один раз.iOS updateSearchResultsForSearchController только вызывал один раз
Однако, если я удалю все в строке поиска, результаты вернутся к тому, чтобы быть нефильтрованными, и если бы я набрал что-то еще, он (снова) будет фильтровать только для первого символа.
Я также пробовал обходное решение here, но проблема все еще сохранялась. Это мой код:
class SearchController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate {
let data = [
"bottlenose dolphin": 111,
"manta ray": 172,
"humphead wrasse": 388,
"Commerson's dolphin": 19
// etc.
]
var results = [String: Int]()
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchController.active && searchController.searchBar.text != "" {
return results.count
} else {
return data.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
if searchController.active && searchController.searchBar.text != "" {
let index = results.startIndex.advancedBy(indexPath.row)
cell.textLabel!.text = results.keys[index]
} else {
let index = data.startIndex.advancedBy(indexPath.row)
cell.textLabel!.text = data.keys[index]
}
return cell
}
func search(searchText: String) {
let temp = data.filter({(element: (String, Int)) -> Bool in
return element.0.lowercaseString.containsString(searchText.lowercaseString)
})
for element in temp { results[element.0] = element.1 }
tableView.reloadData()
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
updateSearchResultsForSearchController(searchController)
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
search(searchController.searchBar.text!)
}
}
Там же есть шанс, что я пропустил шаг, когда скользя учебник, но я посмотрел через него еще несколько раз безрезультатно. Как я могу правильно выполнить поиск?
Редактировать: Я также заметил, что иногда поиск может вызывать результаты, которые даже не содержат первый символ запроса. Например, используя другой набор данных, поиск «J» всплыл «Силиконовая долина» ...
Не могу поверить, что я пропустил что-то простое! Поиск работает сейчас, спасибо! – Technicolor
столкнулся с той же проблемой. благодарность bluedome –