TableView - heightForRowAtIndexPath 未被调用

TableView - heightForRowAtIndexPath not being called

在完成所有其他 Stack Overflow 表单之后,我为我的一个单元格实现了动态高度,如下所示:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell

    if(indexPath.row == 1){
        var image : UIImage = maskRoundedImage(image: UIImage(named: "Temp_Profile.png")!, radius: 150)
        cell.imageView?.image = image
        return cell
    }
    cell.textLabel?.text = TableArray[indexPath.row]
    cell.backgroundColor = UIColor.init(colorLiteralRed: 0.56, green: 0, blue: 0.035, alpha: 1)
    cell.textLabel?.textColor = UIColor.white
    cell.textLabel?.font = UIFont(name: "Helvetica", size: 28)

    return cell
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if  indexPath.row == 1 {
        return UITableViewAutomaticDimension * 3

    }
    return UITableViewAutomaticDimension
}

看起来很简单,但调试会话显示从未调用过 heightForRowAtIndexPath。 View Controller 是一个 UITableViewController,其他一切正常。你们有没有看到这个函数没有被调用的原因?

感谢您的帮助!

在Swift3中,签名为:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat

您有旧签名,因此无法识别。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.row == 1 {
        return UITableViewAutomaticDimension * 3

    }
    return UITableViewAutomaticDimension
}

对我来说,我不得不这样做。

self.tableviewObj.delegate = self

所以,不要忘记给自己添加委托。因为 heightForRowAtIndexparth 是在委托协议中声明的。

如果您在 UITableViewController 中,请记住该方法必须是您需要的方法 override 否则方法名称是错误的。

在我的例子中,我使用的是 NSIndexPath 而不是 IndexPath,它与要调用的正确方法不匹配

tableView(_ tableView: UITableView, heightForRowAt indexPath: NSIndexPath) -> CGFloat

当我更正为

tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat

xcode 会提示插入 override 关键字。

在我的例子中,我有三个控制器A、B、C。A是基本控制器,B继承自A,C继承自B。我在A中设置tableView委托,在B中实现heightForRowAt函数,以及我用C的时候出现这个问题,我猜是因为A中分配的代理最终指向了C,所以没有调用B中的方法。