从 UITableView 隐藏单元格

Posted

技术标签:

【中文标题】从 UITableView 隐藏单元格【英文标题】:Hide cell from UITableView 【发布时间】:2021-03-06 08:12:53 【问题描述】:

我正在尝试隐藏 UITableView 中的单元格。我的代码如下。

当我打开应用程序时,我在 TableViewas you can see here 中看到空行

如何在 UITableView 中隐藏或移除(而不是删除)空单元格?

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
   
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FeedTableViewCell
    
    let row = self.items[indexPath.row]
    
    cell.lblTitle.text = row.title
    cell.isHidden = !checkCurrentUser(email: row.email)
   
    return cell

我添加了过滤数组,但随后出现不同的错误like this。我的新代码如下。我该如何解决这个问题?

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
   
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FeedTableViewCell
    
    
    let row = self.items[indexPath.row]
    self.items = self.items.filtercheckCurrentUser(email: $0.email)
    cell.lblTitle.text = row.title
    //cell.isHidden = !checkCurrentUser(email: row.email)
    
    
    
    return cell

全部代码如下

import UIKit
import Firebase

class OyuncularVC: UIViewController, UITableViewDelegate, UITableViewDataSource 

    
    var items = [ItemModel]()
    
    @IBOutlet weak var tblView: UITableView!
    
    
    override func viewDidLoad() 
        
        super.viewDidLoad()
       
        tblView.tableFooterView = UITableViewHeaderFooterView()
        retrieveItems()
    
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.items.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
       
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FeedTableViewCell
        
        
        let row = self.items[indexPath.row]
        self.items = self.items.filtercheckCurrentUser(email: $0.email) //bunu ekledim siliceksem bunu silicem aga
        cell.lblTitle.text = row.title
        //cell.isHidden = !checkCurrentUser(email: row.email)
        
        
        
        return cell
    
 
    
   
    
    /* Retriev Items */
    
    func retrieveItems() 
        DataService.dataService.ITEM_REF.observe(.value, with:  (snapshot: DataSnapshot?) in
            
            if let snapshots = snapshot?.children.allObjects as? [DataSnapshot] 
                self.items.removeAll()
                print(snapshots.count)
                for snap in snapshots 
                    if let postDic = snap.value as? Dictionary<String, AnyObject> 
                        
                        let itemModel = ItemModel(key: snap.key, dictionary: postDic)

                        print(itemModel)
                        self.items.insert(itemModel, at: 0)
                    
                
                
                self.tblView.reloadData()
            
            
        )
        
    
    
    func checkCurrentUser(email: String) -> Bool 
        let currentUser = Auth.auth().currentUser
        
        return email == currentUser?.email
    
  


    
    


【问题讨论】:

使用过滤数组。比如,从数组中删除隐藏或不想显示的数据。使用这个数组self.items = self.items.filtercheckCurrentUser(email: $0.email) 使用包含数据源所有项目的数组和仅包含要显示的项目的第二个数组。并且不要check cellForRow 中的任何内容,维护模型。 我添加了过滤数组,但现在我看到了一个错误。致命错误:索引超出范围 numberOfRows 必须始终返回实际数组中的项目数。再说一遍,不要检查或过滤 cellForRow 中的任何内容或修改数据源项的顺序。 我是 Swift 的新手,所以我无法理解我应该做什么。我明白你的意思,但我不知道我该怎么做:(请帮助 【参考方案1】:

如果您只想显示当前用户的电子邮件,请不要过滤数据库中的项目(应用谓词),这是最有效的方法。

或者过滤for snap in snapshots循环中的项目。

但是,如果您想保留整个数据集,请声明第二个数组

var items = [ItemModel]()
var filteredItems = [ItemModel]()

替换

for snap in snapshots 
    if let postDic = snap.value as? Dictionary<String, AnyObject> 
        
        let itemModel = ItemModel(key: snap.key, dictionary: postDic)

        print(itemModel)
        self.items.insert(itemModel, at: 0)
    

它执行循环中的检查

let currentUser = Auth.auth().currentUser
self.filteredItems.removeAll()
for snap in snapshots 
    if let postDic = snap.value as? Dictionary<String, AnyObject> 
        
        let itemModel = ItemModel(key: snap.key, dictionary: postDic)

        print(itemModel)
        self.items.insert(itemModel, at: 0)
        if itemModel.email == currentUser?.email 
           self.filteredItems.insert(itemModel, at: 0)
        
    

并将两个数据源方法替换为

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


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
   
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FeedTableViewCell
    
    let row = self.filteredItems[indexPath.row]
    cell.lblTitle.text = row.title  
    return cell

并删除方法checkCurrentUser

【讨论】:

非常感谢您!多亏了你,它现在可以工作了。再次感谢 :) 这让我很开心

以上是关于从 UITableView 隐藏单元格的主要内容,如果未能解决你的问题,请参考以下文章

隐藏 UITableview 单元格

从自定义单元格返回 NSIndexPath ? (UITableView)

IOS UITableView检查一个单元格

如何在自定义单元格的 initWithStyle: 方法中获取 UITableView 的宽高?

在 UITableView 中隐藏/显示单元格?

UITableView:隐藏单元格之间的边框/分隔符