首页 > 解决方案 > 在搜索栏中删除字母后表格视图不会重新加载

问题描述

我正在尝试在我的应用中搜索联系人。我正在使用搜索栏来做到这一点。

假设我有 2 个联系人,Tolga 和 Toygun。当我在搜索栏中输入“收件人”时,两个联系人都会出现在表格视图中。然后我在搜索栏中输入“Toy”,没有人应该出现在表格视图中。问题是当我删除“玩具”中的字母 y 时,没有人继续出现。当我删除字母 y 时,我想在表格视图中看到两个联系人,但我不能。

这是我的代码:

class ContactsVC: UIViewController {
    
    //MARK: - Proporties
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var emptyView: UIView!
    
    
    let fireStoreDatabase = Firestore.firestore()
    var contactArray = [Contact]()
    var tempContactArray = [Contact]()
    var letters: [Character] = []
    var tempLetters: [Character] = [] 

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        
        searchBar.delegate = self
        hideKeyboardWhenTappedAround()
        getDataFromFirebase()
    }
    
    //MARK: - Function to Get Contacts Data From Firebase
    func getDataFromFirebase(){
        fireStoreDatabase.collection("Contacts").order(by: "contactName").addSnapshotListener { (snapshot, err) in
            if err == nil {
                if snapshot?.isEmpty == false && snapshot != nil {
                    self.contactArray.removeAll(keepingCapacity: false)
                    for document in snapshot!.documents {
                        if let uid = document.get("uid") as? String {
                            if uid == self.userId {
                                if let contactUrl = document.get("contactUrl") as? String,
                                   let contactName = document.get("contactName") as? String,
                                   let contactSirname = document.get("contactSirname") as? String,
                                   let contactPhone = document.get("contactPhone") as? String,
                                   let contactEmail = document.get("contactEmail") as? String,
                                   let contactBloodgroup = document.get("contactBloodGroup") as? String,
                                   let contactBirthday = document.get("contactBirthday") as? String{
                                    
                                    self.contactArray.append(Contact(contactUrl: contactUrl, contactName: contactName, contactSirname: contactSirname, contactPhone: contactPhone, contactEmail: contactEmail, contactBloodgroup: contactBloodgroup, contactBirthday: contactBirthday, documentId: document.documentID))
                                }
                                
                            }
                        }
                    }
                    self.tempContactArray = self.contactArray
                    
                    //Section
                    self.letters.removeAll(keepingCapacity: false)
                    self.letters = self.contactArray.map({ (contact) in
                        return contact.contactName.uppercased().first!
                    })
                    self.letters = self.letters.sorted()
                    self.letters = self.letters.reduce([], { (list, name) -> [Character] in
                        if !list.contains(name) {
                            return list + [name]
                        }
                        return list
                    })
                    self.tempLetters = self.letters
                    self.tableView.reloadData()
                    
                } else {
                    self.contactArray.removeAll(keepingCapacity: false)
                    self.tableView.reloadData()
                }
                
                if(self.contactArray.count == 0) {
                    self.emptyView.isHidden = false
                    self.tableView.isHidden = true
                }else{
                    self.emptyView.isHidden = true
                    self.tableView.isHidden = false
                }
            }
        }
    }
    
    //MARK: - Section after search
    func getLetters(contact: [Contact]) {
       
       letters.removeAll(keepingCapacity: false)
       letters = contact.map({ (contact) in
           return contact.contactName.uppercased().first!
       })
       letters = letters.sorted()
       letters = letters.reduce([], { (list, name) -> [Character] in
           if !list.contains(name) {
               return list + [name]
           }
           return list
       })
    }
    
//MARK: - Table View Data Source
extension ContactsVC: UITableViewDelegate, UITableViewDataSource {
    
    func numberOfSections(in tableView: UITableView) -> Int {
        letters.count
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return letters[section].description
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return contactArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ContactsViewCell
        
        if letters[indexPath.section] == contactArray[indexPath.row].contactName.uppercased().first {
            cell.contactImage.sd_setImage(with: URL(string: contactArray[indexPath.row].contactUrl))
            cell.contactFullNameLabel.text = contactArray[indexPath.row].contactName + " " + contactArray[indexPath.row].contactSirname
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if letters[indexPath.section] == contactArray[indexPath.row].contactName.uppercased().first {
            return 100.0
        } else {
            return 0.0
        }
    }
    
   
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(identifier: "AddContactVC") as! AddContactVC
        vc.isNewContact = false
        vc.documentId = contactArray[indexPath.row].documentId
        vc.contact = contactArray[indexPath.row]
        self.present(vc, animated: true, completion: nil)
    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        view.endEditing(true)
    }
    
}

//MARK: - Search Bar
extension ContactsVC: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        print(searchText)
        letters.removeAll(keepingCapacity: false)
        if searchText.isEmpty == false {
            contactArray = contactArray.filter{$0.contactName.lowercased().contains(searchText.lowercased())}
            getLetters(contact: contactArray)
        } else {
            contactArray = tempContactArray
            letters = tempLetters
        }
        
        self.tableView.reloadData()
        
    }
    
}

标签: iosswiftxcode

解决方案


您还可以UISearchController UISearchResultsUpdating使用功能实现协议updateSearchResults并在那里处理您的所有更改。这是一个流畅的教程:https ://www.raywenderlich.com/4363809-uisearchcontroller-tutorial-getting-started


推荐阅读