快速选择多项搜索

时间:2019-01-31 19:56:07

标签: ios swift uitableview uisearchcontroller

我正在尝试实现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!)
        }
    }

2 个答案:

答案 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)
    }