Swift 中 UITableView 的动态搜索功能

Dynamic search function for UITableView in Swift

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

我的错误是:

fatal error: can not increment 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 是我的 table 视图显示的数组。

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

任何有关如何解决此问题的建议都将不胜感激。

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

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

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

这样你就不会搞乱 String.Index 如果你越界就会抛出各种错误。

您也可以考虑将过滤作为替代方案...它更安全、更干净、更短:

func loadSearchData(searchString:String) {

    self.companiesToDisplay = self.companies.filter { [=11=].hasPrefix(searchString) }
    self.companiesTV.reloadData()
}

类似的东西应该可以工作,但如果它与您代码中的其他东西冲突,post 评论。