【发布时间】:2019-01-31 19:56:06
【问题描述】:
我正在尝试同时实现 Tableview 多选和搜索。 多项选择很容易,但我希望在搜索时保持选中单元格。
我找不到任何同时实现两者的示例,所以如果您有任何示例或示例项目可以查看,请随时分享!
这是我的代码:
class InviteVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
var tableView: UITableView!
var phoneContacts = [PhoneContact]()
var selectedContacts = [PhoneContact]()
var filteredContacts = [PhoneContact]()
var rowToSelect = IndexPath(row: 0, section: 0)
var recipients = [String]()
var filter: ContactsFilter = .none
let searchController = UISearchController(searchResultsController: nil)
func filterContentForSearchText(_ searchText: String) {
filteredContacts = phoneContacts.filter({( contact : PhoneContact) -> Bool in
return contact.name!.lowercased().contains(searchText.lowercased())
})
tableView.reloadData()
}
}
extension InviteVC {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if isFiltering() {
return filteredContacts.count
}
return phoneContacts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "ContactCell", for: indexPath) as? ContactCell {
let contact: PhoneContact
if isFiltering() {
contact = self.filteredContacts[indexPath.row]
} else {
contact = self.phoneContacts[indexPath.row]
}
cell.configure(contact)
return cell
}
return UITableViewCell()
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! ContactCell
cell.isSelected = true
let contact: PhoneContact
if isFiltering() {
contact = self.filteredContacts[indexPath.row]
} else {
contact = self.phoneContacts[indexPath.row]
}
self.selectedContacts.insert(contact, at: 0)
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! ContactCell
}
extension InviteVC: UISearchBarDelegate {
// MARK: - UISearchBar Delegate
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
filterContentForSearchText(searchBar.text!)
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
self.selectedContacts.removeAll()
if let selectedItems = tableView.indexPathsForSelectedRows {
for item in selectedItems {
tableView.deselectRow(at: item, animated: true)
let cell = tableView.cellForRow(at: item) as! ContactCell
cell.backgroundColor = .white
tableView.reloadData()
}
}
}
}
extension InviteVC: UISearchResultsUpdating {
// MARK: - UISearchResultsUpdating Delegate
func updateSearchResults(for searchController: UISearchController) {
let searchBar = searchController.searchBar
if let searchText = searchBar.text,
!searchText.isEmpty {
filteredContacts.removeAll()
}
filterContentForSearchText(searchController.searchBar.text!)
}
}
【问题讨论】:
标签: ios swift uitableview uisearchcontroller