【问题标题】:Dynamic search function for UITableView in SwiftSwift 中 UITableView 的动态搜索功能
【发布时间】:2015-02-23 21:02:49
【问题描述】:

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

我的错误是:

致命错误:无法增加 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) 行,但我不知道为什么会产生错误。

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

【问题讨论】:

    标签: ios string function swift search


    【解决方案1】:
    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)
        }
    }
    

    【讨论】:

    • jinx,你欠我一杯苏打水 :)
    • 新的 searchIndex 和 for 循环都有效,但是如果我在比较的字符串上使用 .lowercaseString 会崩溃,你知道这是为什么吗?
    • @frank21:好的,好的。但是,您可以进行不区分大小写的比较,而不是 .lowercaseString,请参阅更新后的答案。
    【解决方案2】:

    一种可能的解决方案是将您的 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()
    }
    

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

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多