我的应用中有一个UICollectionView
。 UICollectionView
填充了自定义对象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()
}
}
但不确定如何在我的情况下实现它。
代码示例对我有用。
提前致谢。
答案 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
与é
匹配)等。