【问题标题】:When will dequeueReusableCell return nil?dequeueReusableCell 什么时候返回 nil?
【发布时间】:2020-04-14 09:03:51
【问题描述】:

我是 iOS 编程领域的新手,最近我在网上看到了一些实现的代码示例,例如:

functableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCell(withIdentifier: customCellIdentifier, for: indexPath) as? CustomCell
    if (cell == nil) {
        cell = CustomCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: customCellIdentifier) asCustomCell
        }
    ...
    }

作者尝试处理dequeueReusableCell返回nil的事件。

但根据我对 UITableView 和自定义单元格的有限个人经验,我还没有遇到过 dequeueReusableCell 给我返回 nil 的情况。

通过研究,我发现原因可能是

“出队…方法试图找到一个具有给定重用的单元格 当前不在屏幕上的标识符。如果他们找到了,他们会返回 那个单元格,否则返回 nil。”

from MrTJ's answer here

但这对我来说从来没有发生过一次。当我故意给它一个错误的标识符时,会发生运行时错误,但一次都没有返回 nil。我想知道这到底什么时候会发生,是否真的有必要进行处理。

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

    该代码不正确。当重用池中没有可用的单元格时(即表视图首次出现时),不带 indexPath 参数的旧形式的 dequeueReusableCell 返回 nil。在这种情况下,您有责任分配一个单元格。

    您的问题中显示的dequeueResuableCell 的较新形式将始终返回一个单元格,因为它会在需要时分配一个单元格。

    如果条件向下转换失败(即返回的单元格不是CustomCell 的实例),您问题中的表达式可以返回nil

    我认为这代表了某处的严重错误配置,应该在开发过程中发现。出于这个原因,通常使用强制向下转换;在开发过程中,您遇到崩溃,解决问题并继续前进。

    let cell = tableView.dequeueReusableCell(withIdentifier: customCellIdentifier, for: indexPath) as! CustomCell
    

    您问题中的代码是某种新旧科学怪人的混合体。

    【讨论】:

    • 感谢您的评论。这准确地解释了它。看起来我是在一个有趣的时间加入这个场景的,这个函数的作用完全掩盖了对我来说存在一个池的事实。从我的角度来看,我认为这个功能的鬃毛不再准确描述它的作用,而是应该重命名/成为一个新功能。
    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 2014-11-04
    • 1970-01-01
    • 2021-10-11
    • 2016-09-05
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多