无法通过heightForRowAt获取tableview中的单元格

时间:2018-01-16 09:30:31

标签: ios swift uitableview autolayout row-height

我尝试为动态内容设置单元格高度。在单元格中我使用两个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
}

enter image description here

我使用xib文件来定义单元格

Comtum cell 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
    }

}

和storyboard xib文件如下

enter image description here

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

heightForRow中,您应该返回UITableViewAutomaticDimension。如果您这样做,那么当tableViewcellForRowAt获取单元格时,viewDidLoad会自动使用自动布局。

简而言之:

  1. tableView.estimatedRowHeight = 100 tableView.rowHeight = UITableViewAutomaticDimension 设置中:

    However, make sure that you read [this article][1] and also [this article on autolayout][4].
    
  2. 在单元格中设置自动布局,以便单元格可以根据其内容确定自己的大小。

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

    首先,单击标签将其选中。然后点击"添加新约束"右下角的图标,请参见下一张图片:

    enter image description here

    一个小弹出窗口显示,设置常量定义标签应该约束的单元格的顶部,左侧,底部和右侧的距离。确保表示激活约束的红线全线(一旦填充常量,它们应该从虚线变为完整)。首先尝试为每个方向设置8,稍后您可以使用它。

  3. enter image description here

    cellForRowAt
    1. 只需在didSelect中返回一个单元格即可。 TableView将使用单元格的自动布局来确定其高度。
    2. 有关详细信息,请参阅this answer或我的other answer for an example in code

      修改

      要根据行数使单元格可扩展,请在tableView中将标签的行数设置为0,并使用以下方法告诉func refreshTableAfterCellExpansion() { self.tableView.beginUpdates() self.tableView.setNeedsDisplay() self.tableView.endUpdates() } 重绘自身:

      didDeselect

      buildscript { repositories { mavenCentral() jcenter() } } repositories { mavenCentral() jcenter { url "http://jcenter.bintray.com/" } } dependencies { compile 'org.lognet:grpc-spring-boot-starter:2.1.4' // change with latest 中执行相同的操作,只是颠倒过来。

答案 2 :(得分:3)

设置行高的自动尺寸&估计行高,确保执行以下步骤,自动尺寸对单元格/行高度布局有效。我刚刚测试了以下步骤和代码并且工作正常。

  • 分配并实施tableview dataSource和delegate
  • UITableViewAutomaticDimension分配给rowHeight& estimatedRowHeight
  • 实施委托/数据源方法(即heightForRowAt并向其返回值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(& line break mode = truncate tail)
  • 相对于其superview / cell容器设置所有约束(顶部,底部,右侧)。
  • 可选:如果您希望标签覆盖最小垂直区域,即使没有数据,也可以设置标签的最小高度。

enter image description here

注意:如果您有多个动态长度的标签(UIElements),应根据其内容大小进行调整:调整内容拥抱和压缩阻力优先级`对于要以更高优先级扩展/压缩的标签。

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

enter image description here