如何搜索多个项目或搜索无论位置如何UISearchBar

时间:2016-03-17 22:35:27

标签: ios regex swift swift2

我一直关注此示例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,搜索就可以了,但是如果我搜索“就是这样”,我就没有结果。

3 个答案:

答案 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()
      }

}