从 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 隐藏单元格的主要内容,如果未能解决你的问题,请参考以下文章
从自定义单元格返回 NSIndexPath ? (UITableView)