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 评论。
我正在尝试为 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 评论。