表视图中的搜索栏失败

Posted

技术标签:

【中文标题】表视图中的搜索栏失败【英文标题】:Search bar in table view fails 【发布时间】:2021-04-10 19:53:18 【问题描述】:

我的搜索栏有问题。我试图在带有搜索栏的表格视图中进行搜索,但是当我输入内容时它什么也没有显示,并且在我删除所有内容后,我尝试搜索的所有餐厅都消失了。

这是我正在使用的代码。我只会发布必要的内容

extension HomeViewController: UISearchBarDelegate
    //MARK: Search bar
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
      
        filteredData = []
        if searchText == "" 
        
            filteredData = datas
        
        else 
       
            for restaurante in datas
           
                if restaurante.title.lowercased().contains(searchText.lowercased())
            
           
                    filteredData.append(restaurante)
            
            
        
        
        self.homeTableView.reloadData()
    
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar)  // Dispare tastatura cand apasam pe search
        searchBar.resignFirstResponder()
    
    






这是变量:

struct Category 
    let title: String
    let photoKeyHome: String



  let datas: [Category] = []
  var filteredData: [Category]!
   
override func viewDidLoad() 
        super.viewDidLoad()
        
        filteredData = datas






这是我的表格视图。也许我在这里做错了什么。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return filteredData.count
        
    

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = homeTableView.dequeueReusableCell(withIdentifier: "homeTableViewCell", for: indexPath) as! homeTableViewCell
        let restaurant = filteredData[indexPath.row]
       
        let storageRef = Storage.storage().reference()
        let photoRef = storageRef.child(restaurant.photoKeyHome)
        
        
        
        cell.myLabel.text = restaurant.title
        cell.myImage.sd_setImage(with: photoRef)

对于数据,我使用 Firestore 和 firebase 存储。 这就是我从 Firestore 获取数据的方式。

  func getDatabaseRecords() 
            
            let db = Firestore.firestore()
           //  Empty the array
          filteredData = []
            
            db.collection("HomeTableViewRestuarants").getDocuments  (snapshot, error) in
                if let error = error 
                    print(error)
                    return
                 else 
                    for document in snapshot!.documents 
                        let data = document.data()
                        let newEntry = Category(
                            title: data["title"] as! String,
                            photoKeyHome: data["photoKeyHome"] as! String
                          
                        )
                        
                            
                            
                            
                        self.filteredData
                            .append(newEntry)
                    
                
                DispatchQueue.main.async 
                    self.homeTableView.reloadData()
                
            
        

TableView After tried to search

after I deleted what I searched

【问题讨论】:

datas 被定义为一个空数组。然后,将filteredData 设置为等于该空数组。除非您没有显示更多代码,否则它肯定是空的。 @jnpdx 我更新了我如何从 Firestore 获取数据。也许有什么东西 【参考方案1】:

如 cmets 中所述,datas 从未设置过。在getDatabaseRecords 替换

DispatchQueue.main.async 
   self.homeTableView.reloadData()

DispatchQueue.main.async 
   self.datas = self.filteredData
   self.homeTableView.reloadData()


顺便说一句,您的textDidChange 方法效率很低。替换为

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)         
    if searchText.isEmpty 
        filteredData = datas
     else 
        filteredData = datas.filter $0.title.range(of: searchText, options: .caseInsensitive) != nil  
    
    self.homeTableView.reloadData()

【讨论】:

以上是关于表视图中的搜索栏失败的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在分组表视图上方放置隐藏搜索栏?

如何正确配置添加到现有表视图控制器的搜索栏?

滚动表视图然后突然单击搜索栏会导致应用程序崩溃?

第四章:IOS Table表视图搜索功能UISearchBar

当搜索栏处于活动状态时,快速表视图被锁定

导航栏在搜索结果表视图中消失