Я реализую функцию поиска по мере ввода, но у меня возникают проблемы с динамическим обновлением количества строк в UITableView.Я использую UISearchBar и запускаю поиск после того, как пользователь набрал три буквы.
Я запрашиваю результаты поиска через API, который извлекает данные асинхронно.Вот как я получаю результаты и обновляю массив источника данных
if let text = searchBar.text {
if text.count >= minSearchStartCriteria {
let tableX:CGFloat = 0
let tableY:CGFloat = searchBar.frame.maxY
let tableWidth:CGFloat = view.frame.width
var tableHeight:CGFloat = 0
// remove the tap recognizer so that the tap on the uitableview
// can be captured
if let tapRecognizer = tapRecognizer,
let recognizers = view.gestureRecognizers {
if recognizers.count > 0 {
view.removeGestureRecognizer(tapRecognizer)
}
}
// create the UITableView
if searchResultsTable == nil {
searchResultsTable = UITableView(frame: CGRect(x: tableX, y: tableY , width: tableWidth, height: tableHeight))
if let searchResultsTable = searchResultsTable {
searchResultsTable.delegate = self
searchResultsTable.dataSource = self
searchResultsTable.register(SearchResultTableViewCell.self, forCellReuseIdentifier: "searchResultTableCell")
view.addSubview(searchResultsTable)
}
}
// update the search results
if let p = onlineSearchPresenter {
p.getSearchResults(request: text) { (results) in
self.searchResults = results
}
tableHeight = CGFloat(searchResults.count * 44)
searchResultsTable?.frame = CGRect(x: tableX, y: tableY, width: tableWidth, height: tableHeight)
searchResultsTable?.reloadData()
}
} else {
// If there is less than "minSearchStartCriteria" letters, remove the table view
searchResults.removeAll()
searchResultsTable?.removeFromSuperview()
searchResultsTable = nil
}
}
Если я наберу «abcd», поиск выдаст 10 результатов, поэтому мой UITableView создается с 10 строками.Здесь нет проблем.Затем, если я продолжу добавлять буквы и сужать поиск, мне будет возвращено меньшее количество результатов, скажем, только 4. Я проверил отладчик, он показывает правильное количество результатов в массиве searchResults
, но tableView(_:cellForRowAt:)
stills пытается извлечь результат из индекса 4, который выходит за пределы диапазона для массива, содержащего только четыре элемента.
Похоже, мне нужно сообщить UITableView, что массив источника данных был обновлен, чтобы онобновил бы свою индексацию.Я подозреваю, что проблема заключается в асинхронном характере обновления массива результатов, но я не могу понять, в чем именно заключается проблема.
Как я могу получить эту работу?
Спасибо