Swift中UITableView的动态搜索功能

时间:2015-02-23 21:02:50

标签: ios string function swift search

我正在尝试为我的表格视图创建搜索功能,但是当我在文本字段中输入第二个字符时,该功能崩溃了。 我可以输入第一个字符,删除它,然后键入一个新字符,它不会崩溃。

我的错误说:

  

致命错误:无法递增endIndex

我的代码如下:

func textFieldDidChange(textField: UITextField){
    self.loadSearchData(textField.text)
}

func loadSearchData(searchString:String){

    var arrayOfSearches: [String] = []
    let index = count(searchString)

    for company in self.companies{
        let searchIndex = advance(company.startIndex, index)
        if searchString == company.substringToIndex(searchIndex){
        arrayOfSearches.append(company)
        }
    }
    self.companiesToDisplay = arrayOfSearches
    self.companiesTV.reloadData()
}

其中companiesToDisplay是我的表格视图显示的数组。

我知道错误在我的let searchIndex = advance(company.startIndex, index)行,但我不知道为什么会造成错误。

任何有关如何解决此问题的建议都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

let searchIndex = advance(company.startIndex, index)
如果index大于字符数,则

在运行时失败 在字符串company中。你可以用

let searchIndex = advance(company.startIndex, index, company.endIndex)
相反,它将起始索引增加index个位置,但不超出字符串的结尾。

更简单的解决方案是使用hasPrefix

for company in self.companies {
    if company.hasPrefix(searchString) {
        arrayOfSearches.append(company)
    }
}

或者使用具有不区分大小写搜索选项的rangeOfString

for company in self.companies {
    if company.rangeOfString(searchString, options: .CaseInsensitiveSearch | .AnchoredSearch) != nil {
        arrayOfSearches.append(company)
    }
}

答案 1 :(得分:1)

一种可能的解决方案是用这个替换你的for循环:

for company in companies {
    if company.hasPrefix(searchString) {
        arrayOfSearches.append(company)
    }
}

这样你就不会搞砸String.Index,如果你超出界限会抛出各种错误。

您也可以考虑将过滤作为替代方案......它更安全,更清洁,更短:

func loadSearchData(searchString:String) {

    self.companiesToDisplay = self.companies.filter { $0.hasPrefix(searchString) }
    self.companiesTV.reloadData()
}

这样的事情应该有效,但如果它与代码中的其他内容发生冲突,请发表评论。