UISearchBar iOS返回索引超出范围的错误

时间:2017-01-24 16:54:16

标签: ios swift3 uisearchbar

我花了大约3个小时试图让这个UISearchbar工作。我有一个Notes的自定义类,其属性为.name。我试图通过属性.name过滤数据(一组注释)。我实现了delegate并实例化了第二个过滤后的数组以及所有必需的协议要求。但我似乎无法使用我的搜索功能来返回正确的数据。以下是我正在使用的当前代码。它建立得很好,但是当我开始在搜索栏中输入时,我得到index out range的错误,这发生在下面的行中并附有注释。这是在视图控制器和其内部的表控制器内完成的。

var notes = [Notes]()
var searchActive : Bool = false
var filtered = [Notes]()

/// these above vars are global /// 

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    searchActive = true;
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    searchActive = false;
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchActive = false;
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchActive = false;
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    filtered = notes.filter(){ (Notes) -> Bool in
        let range = Notes.name.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
        return range != nil
    }
    if(filtered.count == 0){
        searchActive = false;
    } else {
        searchActive = true;
    }
    self.tableView.reloadData()
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var note: Notes

    if(searchActive){
        //// THIS IS WHERE THE ERROR IS THROWN /////
        note = filtered[indexPath.row]
    } else {
        note = notes[indexPath.row]
    }

    if let cell = tableView.dequeueReusableCell(withIdentifier: "NoteCell", for: indexPath as IndexPath) as? NoteCell {
        cell.configureCell(note: note)
        return cell
    } else {
        return NoteCell()
    }

}

1 个答案:

答案 0 :(得分:1)

在方法tableViewsearchActivefalse中将searchBarTextDidEndEditing设置为searchBarCancelButtonClicked后,尝试重新加载searchBarSearchButtonClicked

注意:请勿在方法searchActive中将true设置为searchBarTextDidBeginEditing,因为如果您在条形码上录制并且没有输入任何东西,然后尝试滚动,你也会得到索引越界崩溃。

修改:检查numberOfRowsInSection是否已正确实施。

func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {
    if searchActive {
        return filtered.count
    }
    return notes.count
}