我实现了`estimatedHeightForRowAt indexPath`后UITableView崩溃了?

时间:2018-03-27 07:54:55

标签: ios swift uitableview

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    let cellHeight = self.promotionListViewList[indexPath.row].tableViewHeight.value
    if cellHeight < 0 {
        return 1.0
    } else {
        return cellHeight
    } 
}

当我取消注释此方法并在iPhone5或iPad2上运行我的项目时,我遇到了这个例外:

  

&#39;表格视图行高不得为负数 - 为索引路径提供高度&#39;

并且应用程序崩溃。

但为什么?

我没有在这种方法中产生负值。

如果我评论它没有任何反应。

2 个答案:

答案 0 :(得分:4)

如果您根据此stackoverflow回答 https://stackoverflow.com/questions/18397206/autolayout-error-with-uitableview使用autolayout:

  
      
  1. 估计行高为1.0会导致异常:“NSInternalInconsistencyException”,原因:'表视图行高不得为负...'“
  2.   
  3. 估计小于1.0也有奇怪的结果。

  4.   
  5. 估计2.0和实际工作之间没有任何例外(尽管2.0可能是出于优化原因的不好选择 - 你希望尽可能接近实际)。

  6.   
  7. 约束异常仅在估计行高度大于实际行高时发生。越接近实际,异常发生的可能性就越小。在获得异常之前,您的估计距离似乎与几个不同的因素有关:实际行高,行的位置等。

  8.   

此解决方案应避免例外:

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    let cellHeight = self.promotionListViewList[indexPath.row].tableViewHeight.value
    if cellHeight < 0 {
        return 1.01
    } else {
        return cellHeight
    } 
}

答案 1 :(得分:0)

请改为尝试:

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    let cellHeight = self.promotionListViewList[indexPath.row].tableViewHeight.value
    return max(cellHeight, 1.0)
}