无法通过 heightForRowAt 获取表视图中的单元格

Cannot get cell in tableview by heightForRowAt

我尝试为动态内容设置单元格高度。在单元格中,我使用了两个 UILabel,但我无法从 tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) 访问单元格。正如 tableview 显示的那样,有来自 img 的单元格,但是当我 运行 模拟器中的应用程序时, print("Cell geted") 什么也不输出。 我只是 IOS 开发的初学者,所以我的应用程序中可能存在一些错误的配置。我想知道是什么原因导致的

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let cell = self.tableView.cellForRow(at: indexPath) as? ArticleTableViewCell
    if(cell != nil) {
        print("Cell geted")
    }
    return 120
}

我使用xib文件来定义cell

Comtum 电池 class 如下

import UIKit

class ArticleTableViewCell: UITableViewCell {

    @IBOutlet weak var time: UILabel!
    @IBOutlet weak var digest: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        time.layer.borderWidth = 1
        //time.layer.masksToBounds = true
        time.layer.cornerRadius = 10
        time.backgroundColor = UIColor.cyan
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

故事板 xib 文件如下

您必须提供数据的高度(通过计算数据的任何度量),您无法访问该委托方法中的单元格。

heightForRow 你应该 return UITableViewAutomaticDimension。如果这样做,那么 tableView 在从 cellForRowAt.

获取单元格时会自动使用自动布局

简而言之:

  1. viewDidLoad 设置中:

    tableView.estimatedRowHeight = 100
    tableView.rowHeight = UITableViewAutomaticDimension
    
  2. 在单元格中设置自动布局,以便单元格可以根据其内容确定自己的大小。

    要使用自动布局在 xib 单元中设置单元设计,请阅读 this article。在您的情况下,您可以执行以下操作:

    首先,点击标签select。然后点击右下角的"Add New Constraints"图标,见下图:

    一个小弹出窗口显示,其中设置了一些常量,这些常量定义了标签应该被约束到单元格的上、左、下和右角的距离。确保指示正在激活的约束的红线是实线(一旦您填写常量,它们应该从虚线变为实线)。先试试每个方向都设置8,以后可以玩玩

However, make sure that you read [this article][1] and also [this article on autolayout][4].
  1. 只是 return cellForRowAt 中的一个单元格。 TableView 将使用单元格的自动布局来确定其高度。

参见 this answer for details, or my

编辑

要使单元格根据行数展开,在didSelect中将标签的行数设置为0,并使用以下方法告诉tableView重绘自己:

func refreshTableAfterCellExpansion() {
    self.tableView.beginUpdates()
    self.tableView.setNeedsDisplay()
    self.tableView.endUpdates()
}

didDeselect.

中做同样的事情,只是相反

要为行高和估计行高设置自动尺寸,请确保按照以下步骤制作,自动尺寸对 cell/row 高度布局有效。我刚刚测试了以下步骤和代码并且工作正常。

  • 分配并实现表视图数据源和委托
  • UITableViewAutomaticDimension 分配给 rowHeight & estimatedRowHeight
  • 实施delegate/dataSource方法(即heightForRowAt和return一个值UITableViewAutomaticDimension

-

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Don't forget to set dataSource and delegate for table
    table.dataSource = self
    table.delegate = self

    // Set automatic dimensions for row height
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension
}



// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

对于 UITableviewCell 中的标签实例

  • 设置行数=0(&换行模式=截尾)
  • 设置关于其父视图/单元格容器的所有约束(顶部、底部、左右)。
  • 可选:设置标签的最小高度,如果你想要标签覆盖的最小垂直区域,即使没有数据。

注意:如果你有多个具有动态长度的标签(UIElements),应根据其内容大小进行调整:调整'Content Hugging and Compression Resistance Priority ` 对于您想要 expand/compress 具有更高优先级的标签。

在此示例中,我设置了低拥抱和高压缩阻力优先级,这导致为第二个(黄色)标签的内容设置更多 priority/importance。