首页 > 解决方案 > dequeueReusableCell 什么时候返回 nil?

问题描述

我是 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。”

从 MrTJ 的回答here

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

标签: iosswiftuitableview

解决方案


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

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

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

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

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

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


推荐阅读