为什么我不能使用 searchBar 搜索名字和姓氏?

Why can't I search both first and last names using searchBar?

我已经为 searchBar 实现了代码,如果我搜索一个人的名字或姓氏,它就可以工作。例如,如果我想搜索 Kate Bell,如果我写 "Kate" 就可以搜索,如果我写 "Bell" 就可以搜索。但是如果我写 "Kate B" 搜索结果就会消失。

这是我的代码:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.count == 0 {
        isFiltered = false
        tableViewOutlet.reloadData()
    }else {
        isFiltered = true

        searchInternalArray = contactsInternalArray.filter({ object -> Bool in
            guard let text = searchBar.text else {return false}
            return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
        })

        searchArrayGroups = sectionsArrayGroups.filter({ object -> Bool in
            guard let text = searchBar.text else {return false}
            return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
        })

        searchArraySAEs = sectionsArraySAEs.filter ({ object -> Bool in
            guard let text = searchBar.text else {return false}
            return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
        })


    tableView.reloadData()
}

我喜欢 SO How to search by both first name and last name

它在 objective-c 中,但我无法将其实现到我自己的代码中。我试过这样的事情:

searchInternalArray = contactsInternalArray.filter({ object -> Bool in
    guard let text = searchBar.text?.range(of: object.firstName + object.lastName) else {return false}
    return object.firstName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) || object.lastName.lowercased().contains(text.lowercased().trimmingCharacters(in: .whitespacesAndNewlines))
})

虽然这显然不是应该如何实现的。

编辑 不认为它是相关的,但也许它是:我正在过滤多个 arrays,因为我有来自三个不同来源的数据到 tableView。整个 searchBar 代码如上所示。已更新。

为什么不直接从这两个部分创建全名并以此为基础进行搜索。

let searchResults = contactsInternalArray.filter { object in
    "\(object.firstName) \(object.lastName)".contains(searchText)
}

您仍然可以将它们小写,并且 trim 如果您愿意的话。

除非我遗漏了什么,否则有一个更简单的解决方案:

let name = firstname.lowercased() + " " + lastname.lowercased()
return name.contains(text.lowercased())

这适用于名字、姓氏的任何部分,或两者之间带有 space 的部分。你应该仍然 trim leading/trailing spaces,如果你想摆脱名字和姓氏之间变量 spaces 的问题,你可以 search/replace 他们加倍 spaces 和一个 space.

我从的回答中得到了灵感。
这对我有用

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
         
        self.searchBar.showsCancelButton = true
        
        if searchText != ""{
            self.isSearchActive = true
            
            if self.object.count != 0{
                
                
                filteredContacts = self. object.filter(){
                //("\(([=10=] as FetchedContact).firstName.lowercased()) \(([=10=] as FetchedContact).object.lowercased()) \(([=10=] as FetchedContact).telephone.lowercased())")
                let name = ("\(([=10=] as ContactModel).firstName.lowercased()) \(([=10=] as ContactModel).lastName.lowercased()) \(([=10=] as ContactModel).mobileNumber.lowercased())")
                    return name.contains(searchText.lowercased())
                }
                
                
            }
            self.tblContactList.reloadData()
        }
        
     }

  • 根据名字、姓氏和手机号码搜索联系人。