我在一个tableview中有一个collectionview,并试图搜索XML数据。我的searchcontroller在主表视图的视图控制器上,结果显示在单独的搜索结果视图控制器上。一些字母将搜索没有任何问题。但是,当我搜索某些字母时,我得到以下索引超出范围错误:
我调试了一下,发现过滤后的数据有时与返回/显示的数据不同:
我尝试添加不同的条件来处理不同的计数,但是在cellForItemAt中索引崩溃或在didSelectItemAt崩溃。
我的代码:
主视图控制器:
var filteredData = [AgeRangeData]()
func updateSearchResults(for searchController: UISearchController) {
filteredData.removeAll()
for missingFilteredData in allAgesArray {
filteredData.append(missingFilteredData)
}
if let searchText = searchController.searchBar.text {
filteredData = allAgesArray.compactMap {
var filterObjects = $0
filterObjects.ageRangeData = $0.ageRangeData.filter {
$0.title.range(of: searchText, options: .caseInsensitive) != nil
}
return filterObjects.ageRangeData.isEmpty ? nil : filterObjects
}
let searchResultsVC = searchController.searchResultsController as! SearchResultsVC
searchResultsVC.missingFilteredData = filteredData
DispatchQueue.main.async {
searchResultsVC.resultsTableView.reloadData()
}
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
self.searchBarActive = false
} else {
self.searchBarActive = true
updateSearchResults(for: searchController)
}
DispatchQueue.main.async {
self.missingTableView?.reloadData()
}
}
搜索结果视图控制器:
var missingKidData: [AgeRangeData] = []
var missingFilteredData: [AgeRangeData]? = []
var missingKidSearchData: AgeRangeData!
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return missingFilteredData?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "searchResultsCell", for: indexPath) as! SearchResultsTableViewCell
if (missingFilteredData?.count)! > indexPath.row {
let missingSearchKidData = missingFilteredData![indexPath.row].ageRangeData
cell.missingKidData = missingSearchKidData[indexPath.row]
cell.missingResultsImage.layer.cornerRadius = 5.0
cell.missingResultsImage.clipsToBounds = true
return cell
}
return UITableViewCell()
}