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

时间:2019-10-30 15:07:33

标签: swift uitableview filter uisearchbar

我已经为searchBar实现了代码,如果我搜索一个人的名字或姓氏,它就可以工作。例如,如果我想搜索凯特·贝尔,那么如果我写“凯特”,搜索就可以,而如果我写“贝尔”,搜索就可以。但是,如果我写“ 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代码类似于上面。已更新。

3 个答案:

答案 0 :(得分:1)

为什么不只是从两个部分创建全名并基于此进行搜索。

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

您仍然可以小写并根据需要进行修剪。

答案 1 :(得分:1)

除非我缺少任何东西,否则有一个更简单的解决方案:

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

这适用于姓氏,姓氏或两者之间有空格的部分。您可能仍应修剪前导/后缀空格,如果要消除姓氏和名字之间的可变空格问题,可以搜索/将它们替换为一个空格的双空格。

答案 2 :(得分:0)

我从flanker的答案中得到了主意。
这对我有用

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

  • 基于FirsName,LastName和MobileNumber搜索联系人。