为啥在 heightForRowAt 方法中我的单元格为零?

Posted

技术标签:

【中文标题】为啥在 heightForRowAt 方法中我的单元格为零?【英文标题】:Why in heightForRowAt method my cell is nil?为什么在 heightForRowAt 方法中我的单元格为零? 【发布时间】:2018-01-10 17:21:30 【问题描述】:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    if let cell = tableView.cellForRow(at: indexPath) as? ExpandablePlaneTableViewCell 
        return 400.0
    

    return 75.0

我想更改单元格的大小,但在 heightForRowAt 内部它看不到我的 cell 并崩溃了。当我把if let放在那里时,检查它没有进入块内,只需要75。

谁能告诉我问题是什么?这对我来说太奇怪了! 我已经将委托设置为自我。所以它调用了该函数,但无法检测到我的单元格。

更新

在我的ExpandablePlaneTableViewCell 我有一个变量:

var exapanded = false

稍后在我的 ViewController 中:单击单元格中的按钮时,我运行我的委托方法:

func expandViewButtonTapped(_ sender: ExpandablePlaneTableViewCell, for indexPath: IndexPath) 
    sender.exapanded = true
    tableView.reloadRows(at: [indexPath], with: .automatic)

在我想扩展它并重新加载单元格之后

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "expandableCell", for: indexPath) as! ExpandablePlaneTableViewCell

    cell.delegate = self
    cell.indexPath = indexPath

    return cell

【问题讨论】:

它无法获取单元格或单元格从不属于ExpandablePlaneTableViewCell 类型?你能检查一下吗? 不要那样做。如果单元格不可见,首先tableView.cellForRow(at:) 将返回 nil。 tableView.cellForRow(at: indexPath) 是返回 nil 还是返回不可转换为 ExpandablePlaneTableViewCell 的东西?您可以通过此时调试应用程序并查看tableView.cellForRow(at: indexPath) 的结果来验证这一点。 @Larme 但我需要知道要更改其大小的单元格是什么。我必须检查它是否被扩展了 @GiuseppeLanza 它似乎从来都不是 ExpandablePlaneTableViewCell 类型 【参考方案1】:

不要尝试在heightForRowAt 中获取单元格。在您的情况下,当然没有理由这样做。

您似乎希望某些类型的单元格的高度为一个值,而其他类型的单元格为另一个高度。

只需使用与cellForRowAt 相同的基本逻辑,基于indexPath,即可确定要返回的高度。 换句话说,决定基于您的数据模型,而不是单元格。

【讨论】:

以及如何设置cellForRowAt 的高度。看来我没明白你的意思=/ 你没有。您从cellForRowAt 返回一个单元格。你从heightForRowAt返回高度。 当您实际创建单元格时,您将在某处出现类似if expandable: create a cell of type ExpandablePlaneTableViewCell 的内容。使用相同的逻辑。要了解它是否已扩展,您可能希望将布尔值存储在 [IndexPath: Int] 类型的字典中,这样您就不必依赖可以重用的单元格中的值。 @J.Doe 如果我的回答目前对您没有意义,请使用完整的cellForRowAt 方法更新您的问题,然后我可以用更具体的示例更新我的答案。跨度> @rmaddy 我已经更新了我的问题。我希望它能帮助你更好地了解我

以上是关于为啥在 heightForRowAt 方法中我的单元格为零?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 iOS 7 中我的本地通知没有显示横幅

为啥单例对象创建的scala程序不需要静态main方法?

Vue.js:为啥我的单文件组件没有在我的模板中呈现/显示

为啥模块的单例方法在混合的下游特征类中不可见?

为啥我的单引号 (') 没有被编码?

为啥在移动设备中我的 flex 样式会超出我的导航栏