【问题标题】:Why can't I search both first and last names using searchBar?为什么我不能使用 searchBar 同时搜索名字和姓氏?
【发布时间】:2020-02-25 22:18:56
【问题描述】:

我已经为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()
}

我喜欢这个SOHow 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 代码如上所示。已更新。

【问题讨论】:

  • contactsInternalArray的类型是什么?
  • 如果您键入“Kate B”,则链接的答案不会找到“Kate Bell”。如果你搜索“B Kate”呢?它应该找到“凯特贝尔”吗?
  • @Dávid Pásztor var contactsInternalArray: [InternalContact]。该类允许访问NSString firstNameNSString lastName 等。
  • @Larme 啊,我的错。但是,是的,搜索 B Kate 也应该给出结果 Kate Bell。那会很好:)

标签: swift uitableview filter uisearchbar


【解决方案1】:

我从flanker 的回答中得到了想法。
这对我有用

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(){
                //("\(($0 as FetchedContact).firstName.lowercased()) \(($0 as FetchedContact).object.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 搜索联系人。

【讨论】:

    【解决方案2】:

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

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

    这适用于名字、姓氏或两者之间有空格的任何部分。您可能仍然应该修剪前导/尾随空格,如果您想摆脱名字和姓氏之间可变空格的问题,您可以用单个空格搜索/替换它们。

    【讨论】:

      【解决方案3】:

      为什么不直接从这两个部分创建全名并根据它进行搜索。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        相关资源
        最近更新 更多