在集合视图中搜索功能

时间:2018-01-23 23:56:33

标签: swift uicollectionview searchbar

我的应用中有一个UICollectionViewUICollectionView填充了自定义对象Employee中的数据。 Employee对象具有以下属性:

firstName: String
lastName: String
phoneNumber: String
email: String

我想向UICollectionView添加搜索功能。能够仅通过firstName或lastName搜索员工。当我使用他们的名/姓搜索特定员工时,如果找到,则应在集合视图中显示该特定记录。如果不是,我想显示一个空的集合视图。当没有搜索任何内容时,它应该显示CollectionView中的所有记录。

由于Employee是一个包含许多属性的自定义对象,我不知道如何实现搜索。

我发现了一篇文章,展示了如何在UITableView中为String数组实现搜索:

 class ViewController: UIViewController, UITableViewDataSource, UISearchBarDelegate {

 @IBOutlet weak var tableView: UITableView!
 @IBOutlet weak var searchBar: UISearchBar!

 let data = ["New York, NY", "Los Angeles, CA", "Chicago, IL", "Houston, TX",
    "Philadelphia, PA", "Phoenix, AZ", "San Diego, CA", "San Antonio, TX",
    "Dallas, TX", "Detroit, MI", "San Jose, CA", "Indianapolis, IN",
    "Jacksonville, FL", "San Francisco, CA", "Columbus, OH", "Austin, TX",
    "Memphis, TN", "Baltimore, MD", "Charlotte, ND", "Fort Worth, TX"]

var filteredData: [String]!

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    searchBar.delegate = self
    filteredData = data
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableCell", for: indexPath) as UITableViewCell
    cell.textLabel?.text = filteredData[indexPath.row]
    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filteredData.count
}

// This method updates filteredData based on the text in the Search Box
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    // When there is no text, filteredData is the same as the original data
    // When user has entered text into the search box
    // Use the filter method to iterate over all items in the data array
    // For each item, return true if the item should be included and false if the
    // item should NOT be included
    filteredData = searchText.isEmpty ? data : data.filter { (item: String) -> Bool in
        // If dataItem matches the searchText, return true to include it
        return item.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil
    }

    tableView.reloadData()
  }
}

但不确定如何在我的情况下实现它。

代码示例对我有用。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我假设你也想忽略案例。试试这个:

let lowerSearchText = searchText.lowercased()
filteredData = searchText.isEmpty ? data : data.filter { employee -> Bool in
    return employee.firstName.lowercased().hasPrefix(lowerSearchText) || employee.lastName.lowercased().hasPrefix(lowerSearchText)
}

您可能希望将其扩展为支持其他区域设置(将eé匹配)等。