如何在 UITableView 中实现 dequeueReusableCell(withIdentifier:) 的代码?

Posted

技术标签:

【中文标题】如何在 UITableView 中实现 dequeueReusableCell(withIdentifier:) 的代码?【英文标题】:how to Implement the code for dequeueReusableCell(withIdentifier:) in UITableView? 【发布时间】:2021-06-06 11:04:59 【问题描述】:

我的朋友被要求为 Facebook 的 ios 工程师角色快速实现 dequeueReusableCell(withIdentifier:)。

问题

假设您在 Apple 工作,但实现代码突然丢失。你要做的是实现 dequeueReusableCell(withIdentifier:) 的代码。 您将如何实现该功能?

class UItableView: UIScrollView 
    
    func dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? 
        
    

我的实现:

class UItableView: UIScrollView  
    let cells = [UITableViewCell]()
    
    func dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? 
        return cells.filter  $0.identifier == identifier .first
    

我不确定它有多正确。

我认为存储带有索引的单元格的字典会是更好的方法。

谁能评论一下这个函数怎么写?

【问题讨论】:

【参考方案1】:

我将创建一个字典,将identifier 与一组可用单元格相关联。当您需要一个单元格时,您可以删除并尽可能返回最后一个元素。

如果没有可用的单元格,则返回nil

popLast() 函数提供了我们需要的功能,并且复杂度为 O(1)。

一旦单元格不再可见,表格视图需要将单元格重新添加到重用数组中。

class UItableView: UIScrollView 
    let cellReusePools: [String:[UITableviewCell]] = [:] 
    
    func dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? 

        return cellReusePools[identifier]?.popLast()
    

【讨论】:

不,这个表单返回一个可选的。它是原始数据源方法,如果需要,更新、更常用的方法会创建单元格,但该表单接受索引路径并且不返回可选值。在问题中,他们使用较旧的表单使其变得更容易,因此您无需担心单元格的创建。 如果我们必须考虑 IndexPath 怎么办?字典的值会是另一个以行/节为键的嵌套字典吗? 你会如何使用 indexPath?

以上是关于如何在 UITableView 中实现 dequeueReusableCell(withIdentifier:) 的代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableView 的索引列表中实现放大镜? [关闭]

如何在 UITableView 中实现 dequeueReusableCell(withIdentifier:) 的代码?

如何在 UITableView 中实现类似 UIImageView 的延迟加载

如何在 UITableView 的 RXswift 和 RXCocoa 中实现 tableview 单元格的内部?

如何在 UITableView Cell 中实现类似于 iOS 邮件的从左向右滑动

使用 scrollViewDidScroll 方法在 UITableView 中实现分页?