2017-01-24 62 views
0

我花了大約3個小時試圖讓這個UISearchbar正常工作。我有一個Notes的自定義類,它有一個屬性.name。我試圖通過屬性.name過濾數據(一系列註釋)。我實現了delegate並實例化了第二個過濾的數組以及所有需要的協議要求。但我似乎無法讓我的搜索功能返回正確的數據。以下是我正在使用的當前代碼。它建立良好,但是當我開始在搜索欄中輸入時,出現index out range的錯誤,這發生在下面的行中,附帶註釋。這是從視圖控制器和其內部的表控制器內完成的。UISearchBar iOS返回索引超出範圍的錯誤

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() 
    } 

} 
+0

如果從「搜索欄:textDidChange」條件只能刪除方法和searchbar.text =「」加入這一行「searchBarCancelButtonClicked」的方法,你的問題已經解決。 – Vivek

+0

如果你想要更多的澄清請添加你的所有視圖控制器代碼,我會建議你的代碼有什麼問題 – Vivek

回答

1

嘗試重新加載tableView還的方法searchBarTextDidEndEditingsearchBarCancelButtonClickedsearchBarSearchButtonClicked設置searchActivefalse後。

注:不要設置的方法searchBarTextDidBeginEditingsearchActivetrue因爲如果你貼在searbar並沒有輸入任何東西,並試圖滾動那麼你也將獲得索引越界崩潰。

編輯:檢查numberOfRowsInSection是否正確實施或沒有。

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

請檢查編輯答案。 –

+0

我嘗試添加,但它似乎仍然出錯。看來,當我輸入它找到的文本時,例如一個'note.name'等於「test」。第二個'note.name'等於「text」,我可以輸入「te」,但只要我輸入「s」試圖輸入「test」就會出錯 – user1881482

+0

@ user1881482檢查我編輯過的答案一次。 –