某些字母导致索引超出范围CollectionView / TableView UISearchController

时间:2018-10-05 17:42:14

标签: ios swift uitableview uicollectionview uisearchcontroller

我在一个tableview中有一个collectionview,并试图搜索XML数据。我的searchcontroller在主表视图的视图控制器上,结果显示在单独的搜索结果视图控制器上。一些字母将搜索没有任何问题。但是,当我搜索某些字母时,我得到以下索引超出范围错误:

index out of range

我调试了一下,发现过滤后的数据有时与返回/显示的数据不同:

different array counts

我尝试添加不同的条件来处理不同的计数,但是在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()
    }

0 个答案:

没有答案