Swift-Tableview无法通过搜索查询正确更新

问题描述 投票:0回答:2

我正在使用带有表视图的搜索栏控制器。我正在手机上获取联系人以填充表格视图。这是我这部分的代码。

func fetchContacts(){

    let key = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] as [CNKeyDescriptor]
    let request = CNContactFetchRequest(keysToFetch: key)
    try! contactStore.enumerateContacts(with: request) {(contact, stoppingPointer) in

        let name  = "\(contact.givenName) \(contact.familyName)"
        let number = contact.phoneNumbers.first?.value.stringValue

        for numbero in contact.phoneNumbers {

            if let number = numbero.value as? CNPhoneNumber,
                let label = numbero.label {

                var contactToAppend = ContractStruct(givenName: name, number: number.stringValue)
                self.contacts.append(contactToAppend)
            }
        }
    }
        tableView.reloadData()
}

它将正确检索具有不同电话号码的联系人,然后显示在表格视图中。我还在表视图上添加了多项选择,以便能够选择多个联系人以继续我的应用程序流程。

我的问题是,当我在搜索栏中搜索联系人时,它总是在我的表格视图中给我错误的联系人。它总是在顶部带有相同的名称。 Returns wrong contact

现在,如果我打印过滤后的联系人列表,它将返回应已显示但未显示在表格视图中的正确联系人。这是我的搜索代码

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    if searchBar.text! == "" {
        filteredContacts = contacts

    } else {
    // Filter the results
        filteredContacts = contacts.filter { $0.givenName.lowercased().contains(searchBar.text!.lowercased())
        }
    }

    print(filteredContacts)
    tableView.reloadData()

}

这是我的全班学生:

class ContactsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {

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

    var contactStore = CNContactStore()
    var contacts = [ContractStruct]()
    var filteredContacts = [ContractStruct]()

    var setSelectedItems: Set<Int> = []
    var searching = false

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        tableView.delegate = self
        tableView.dataSource = self
        searchBar.delegate = self


        contactStore.requestAccess(for: .contacts) {(success, error) in

            if success {
                print("Authorisation Successful")
            }

            self.fetchContacts()


        }

        filteredContacts = contacts

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

         return filteredContacts.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

             let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil)

              if setSelectedItems.contains(indexPath.row) {
                cell.accessoryType = .checkmark
                    }

              else {
                cell.accessoryType = .none
                    }



              let contactToDisplay = contacts[indexPath.row]
              cell.textLabel?.text = contactToDisplay.givenName
              cell.detailTextLabel?.text = contactToDisplay.number


              return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        if setSelectedItems.contains(indexPath.row) {
               setSelectedItems.remove(indexPath.row)
           } else {
               setSelectedItems.insert(indexPath.row)
           }
           tableView.reloadRows(at: [indexPath], with: .none)

         print(setSelectedItems)
    }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

        if searchBar.text! == "" {
            filteredContacts = contacts

        } else {
        // Filter the results
            filteredContacts = contacts.filter { $0.givenName.lowercased().contains(searchBar.text!.lowercased())
            }
        }

        print(filteredContacts)
        tableView.reloadData()

    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searching = false
        searchBar.text = ""
        tableView.reloadData()

        }


    func fetchContacts(){

        let key = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] as [CNKeyDescriptor]
        let request = CNContactFetchRequest(keysToFetch: key)
        try! contactStore.enumerateContacts(with: request) {(contact, stoppingPointer) in

            let name  = "\(contact.givenName) \(contact.familyName)"
            let number = contact.phoneNumbers.first?.value.stringValue

            for numbero in contact.phoneNumbers {

                if let number = numbero.value as? CNPhoneNumber,
                    let label = numbero.label {

                    var contactToAppend = ContractStruct(givenName: name, number: number.stringValue)
                    self.contacts.append(contactToAppend)
                }
            }
        }
            tableView.reloadData()
    }




    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}
arrays swift xcode uitableview uisearchbar
2个回答
0
投票

我必须替换cellforrow中的filterContacts [indexPath.row]才能起作用。


0
投票

只需在tableView委托的contacts[indexPath.row]函数中将filteredContacts[indexPath.row]替换为cellForRowAt

因为过滤后的结果存储在filteredContacts中,并且您的tableView delegate函数使用filteredContacts

© www.soinside.com 2019 - 2024. All rights reserved.