Ios 如何发现HeightForRowatineXpath崩溃的原因

Ios 如何发现HeightForRowatineXpath崩溃的原因,ios,uitableview,Ios,Uitableview,我不是一个全职的iOS开发人员,我正在尝试以当前的indexath返回单元格,但是这会崩溃,我不知道确切的原因。我在单元格上动态保持高度。我的单元格是一个名为胶束的自定义UITableViewCell,我有一个名为height的属性,该属性在updateCell方法中动态计算 #import "MICell.h" -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPa

我不是一个全职的iOS开发人员,我正在尝试以当前的indexath返回单元格,但是这会崩溃,我不知道确切的原因。我在单元格上动态保持高度。我的单元格是一个名为胶束的自定义UITableViewCell,我有一个名为height的属性,该属性在updateCell方法中动态计算

#import "MICell.h"

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  MICell *cell = (MICell *)[self tableView:tableView cellForRowAtIndexPath:indexPath];
  // hardcoded to 200.0f but still crashing
  NSLog(@"here is my height; %f",cell.height);
  return 200.0f;
}
编辑1 作为一种解决方法,我可以创建一个实例变量,只需写入当前单元格高度,然后在heightForRowAtIndexPath中访问该高度,如下所示。我确实觉得这可能是在做出我不完全满意的假设:

@interface ListViewController (){
  NSMutableArray *_data;
  CGFloat _currentCellHeight;

}

...

-(MICell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{
  static NSString *CellIdentifier = @"MICell";
  MICell *cell = [tableView
                            dequeueReusableCellWithIdentifier:CellIdentifier
                            forIndexPath:indexPath];

  // Configure the cell here ...
  NSDictionary *tmp=[_data objectAtIndex:indexPath.row];
  [cell updateCell:tmp];
  _currentCellHeight=cell.height;
  return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  return _currentCellHeight;
}
编辑2 这里是对这种精确技术的参考

编辑#3
上面的代码工作正常-IB连接存在问题。

在ios中,单元格的高度以HeightForRowatineXpath计算。您要做的是获取Rowatindexpath中单元格的高度。这绝对不是做这件事的方式。要具有动态高度,请使用可能需要的特征/值计算RowAtIndexPath的内部高度,然后返回该高度

底线是您不能调用cell.height inside heightForRowAtIndexPath

编辑1:

为了帮助您处理单元格中的动态高度,请参阅本教程。这可能有助于您了解问题:


直接转到tableView委派方法,了解如何继续。

这是因为你造成了一个无限循环。您不能呼叫:

[self tableView:tableView cellForRowAtIndexPath:indexPath];
索引路径处的行的高度

[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
从索引路径处的行的高度调用时将导致问题。必须调用tableView dequeueReusableCellWithIdentifier:而不使用forIndexPath。您可能应该创建一个configureWithCell:(YourCellClass*)cell方法,将其与这些方法分开,这样您就可以在正确地对单元格进行排队/分配后对其进行配置

此外,您也不会像上面那样从单元格中获取高度(除非您使用一些奇怪的转发内容来分配height属性,这会破坏类包含……您也不应该这样做)。通过自动布局使用以下动态单元高度:
CGFloat cellHeight=[cell.contentView系统布局大小设置大小:UILayoutFittingCompressedSize]。高度

下面类似的内容应该可以做到这一点:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    MyCellClass *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([MyCellClass class]) forIndexPath:indexPath];
    [self configureMyCell:cell forIndexPath:indexPath];

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    MyCellClass * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([MyCellClass class])];
    [self configureMyCell:cell forIndexPath:indexPath];

    CGFloat cellHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    return cellHeight;
}

它在哪条线上坠毁?它还记录什么吗?有错误消息吗?不幸的是没有错误消息-wsa思考只是语法问题。我将更新一个编辑,这是一个解决办法,似乎工作。我想知道是否有非=解决方案sol'n ThoughtSee,了解如何获取适当的异常消息和堆栈跟踪。在其他任何操作之前,表视图中的任何单元格都会调用“HeightForRowatineXpath”(除非您还实现了“EstimatedHeightForRowatineXpath:”)。因此,在这种情况下,“编辑1”不会执行您想要的操作。设置断点,是否初始化了_数据?这是我最好的猜测。数据是def初始化的-我同意edit#1很难看,但在没有估计HeightForrowatineXpath的情况下工作正常。我在自定义UITableViewCell上有一个名为height的公共属性,我在这里计算高度。但这有点混乱,所以我会更新问题。事实上,问题还是一样的。在调用CellForRowatineXpath之前调用HeightForRowatineXpath。所以你故意打电话也会导致错误。尝试创建一个类似getUpdatedHeight的方法,该方法仅基于indexRow计算高度(就像updateCell方法一样)。然后在cellForRowAtIndexPath中调用该函数。在iOS中,实际上有一种方法可以动态计算此方法中的单元格高度:CGFloat cellHeight=[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;在RowAtIndexPath的高度范围内。对于动态单元高度,应将上述参数与自动布局一起用于动态计算。记住,单元格本身没有高度,contentView有。但这个答案也没有说明为什么上面的内容会导致应用程序崩溃。我无法对崩溃发表评论,因为我不知道日志到底显示了什么。我只知道,这种方法是错误的,这可能是崩溃的原因。感谢您对无限循环的解释