我一直关注此示例https://www.raywenderlich.com/113772/uisearchcontroller-tutorial 我已经合并了sqlite来填充tableview,但是目前搜索使用带有.contains的子字符串。
func filterContentForSearchText(searchText: String, scope: String = "All") {
filteredFood = food.filter { candy in
return candy.name.lowercaseString.containsString(searchText.lowercaseString)
}
tableView.reloadData()
}
我看了几个不同的方式,NSPredicates和Regex,但我不太确定如何正确地合并它们,或者如果那就是我甚至需要做的事情。
Ex.Cell是“Stackoverflow太棒了!” 如果我搜索Stackoverflow,搜索就可以了,但是如果我搜索“就是这样”,我就没有结果。
答案 0 :(得分:3)
您正在寻找一种更加自定义的搜索方法,您必须自己开发。
对于您提供的示例,此代码会搜索要匹配的每个单词:
let searchTerms = searchText.componentsSeparatedByString(" ").filter { $0 != "" }
filteredFood = food.filter { candy in
for term in searchTerms{
if !candy.name.lowercaseString.containsString(term.lowercaseString){
return false
}
}
return true
}
答案 1 :(得分:0)
您可以使用NSRegularExpression
为此使用正则表达式。对于正则表达式进行关键字搜索,我认为最好的方法是按照以下方式执行:(str1|str2|str3)
。
所以,在swift中你可以创建用'|'替换空格然后使用正则表达式:
let rtext = searchText.stringByReplacingOccurrencesOfString(" ", withString: "|");
let regex = NSRegularExpression(pattern: "(\(rtext))", .CaseInsensitive);
filteredFood = food.filter { candy in
return regex.numberOfMatchesInString(candy.name, options: 0, range: NSRange(0, candy.name.characters.count) > 0;
}
(注意没有测试代码)
答案 2 :(得分:0)
您可以搜索多个标签,例如您有一个包含州和城市的课程。因此,如果城市不存在,它将显示该州的其他城市。
以下是我要采取的措施:
// Set up the search text
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
// Create and divid the string into substring such as "You are" to "You" and "are"
let searchTerm = searchText.components(separatedBy: " ").filter{ $0 != "" }
// Whatever is being filtered is assigned to rilteredArrayPropertys
filteredArrayPropertys = arrayPropertys.filter({ (state) -> Bool in
// Search each term or substring
for term in searchTerm{
// Check which substring is equal state.propertyState, and if it statsifies it will return and assign to state.propertyState.
// .range(of: ): is what is being typed into search bar. state.propertyState is what has been setted.
if (state.propertyState.lowercased().range(of: term.lowercased()) != nil) || (state.propertyCity.lowercased().range(of: term.lowercased()) != nil) {
return true
}
}
return false
})
if searchText != "" {
shouldShowSearchResults = true
self.tableView.reloadData()
}
else {
shouldShowSearchResults = false
self.tableView.reloadData()
}
}