我正在尝试实现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!)
}
}
答案 0 :(得分:0)
将其添加到cellForRowAtIndexPath
下的cell.configure(contact)
方法中:
cell.isSelected = self.selectedContacts.contains(contact)
答案 1 :(得分:0)
您不必在cell.isSelected = true
方法中设置didSelectRowAt
。这将由tableview自动完成。
保持选择的诀窍是让tableview在重新加载单元格后选择一行。可能是最好的地方,把它在willDisplayCell
。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let contact = searchController.isActive ? filteredContacts[indexPath.row] : contacts[indexPath.row] //Update as needed
if selectedContacts.contains(contact) {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
} else {
tableView.deselectRow(at: indexPath, animated: false)
}