在TableView中搜索时iOS崩溃错误indexPath超出范围

时间:2018-07-24 13:32:28

标签: ios swift uitableview uisearchbar

我有2个数组,一个是基本包含532个元素,另一个是过滤器数组。我有UISearchBar,其中有委托方法

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    self.filter(searchText: searchText)
}

private func filter(searchText: String) {
    if searchText.isEmpty {
        self.filterDelegates = self.delegates
    } else {
        self.filterDelegates = self.delegates.filter {
            $0.delegate.fullName.lowercased().contains(searchText.lowercased())
        }
    }
    self.tableView.reloadData()
}

当我滚动tableview并开始搜索它时,它崩溃了,这不是在self.tableView.reloadData()方法上重置indexPath

以索引路径登录CellforRow

INDEXPATH : 23
FILTER COUNT : 396
INDEXPATH : 22
FILTER COUNT : 20


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(
            withIdentifier: DelegateTableViewCell.defaultReuseIdentifier
        ) as! DelegateTableViewCell
        print("INDEXPATH : \(indexPath.row)")
        print("FILTER COUNT : \(self.filterDelegates.count)")
        cell.item = self.filterDelegates[indexPath.row] // Index out of bound
        return cell
    }

我也使用相同的过滤器数组。行方法

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.filterDelegates.count
}

我在做什么错?

3 个答案:

答案 0 :(得分:0)

由于您是说这是在表视图滚动时发生的,因此我将终止在搜索功能内部的滚动,如下所示:

private func filter(searchText: String) {
    //force stop the scroll
    tableView.setContentOffset(tableView.contentOffset, animated: false) 

    if searchText.isEmpty {
        self.filterDelegates = self.delegates
    } else {
        self.filterDelegates = self.delegates.filter {
            $0.delegate.fullName.lowercased().contains(searchText.lowercased())
        }
    }
    self.tableView.reloadData()
}

答案 1 :(得分:0)

每次都先滚动然后更新。

colors

答案 2 :(得分:-1)

我不确定,但可能是主线程问题。请尝试将self.tableView.reloadData()放在主线程中。

  

DispatchQueue.main.async {self.tableView.reloadData()}