heightForRowAtIndexPath - 为什么会崩溃

时间:2014-10-07 01:58:18

标签: ios uitableview

编辑#3

以下代码运行正常 - IB连接存在问题;阅读/回答的人


不是全职的iOS开发者,我试图在当前的indexPath上返回单元格,但这是崩溃而不确定原因。我在单元格上动态保持高度。我的单元格是一个名为MICell的自定义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

对于投票和投票结束的人来说,这里提到了这种确切的技术。 How to get the cell object in tableView:(UITableView *)tableView heightForRowAtIndexPath function?

2 个答案:

答案 0 :(得分:6)

这是因为你造成了无限循环。你不能打电话:

[self tableView:tableView cellForRowAtIndexPath:indexPath];

索引路径中行的高度。

[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
从高度为索引路径处的行调用时,

将导致问题。您必须调用tableView dequeueReusableCellWithIdentifier:不使用forIndexPath。您应该创建一个与这些单独的configureWithCell:(YourCellClass *)单元格方法,这样您就可以在正确出列/分配单元格后配置它。

另外,你没有像上面那样从单元格中获取高度(除非你给一个高度属性赋予一些奇怪的转发内容,这些东西打破了类包含......你也不应该这样做)。通过自动布局将以下内容用于动态单元格高度: CGFloat cellHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

下面的内容应该可以解决问题:

- (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;
}

答案 1 :(得分:1)

在ios中,单元格的高度在heightForRowAtIndexPath中计算。你要做的是在heightForRowAtIndexPath中获取单元格的高度。绝对不是这样做的方式。要获得动态高度,请使用您可能需要的要素/值计算heightForRowAtIndexPath内的高度并返回该高度。

底线是你不能在heightForRowAtIndexPath里面调用cell.height。

编辑1:

为了帮助您处理单元格中的动态高度,请查看本教程。它可能有助于您了解此问题:Dynamic Cell

直接进入tableView委托方法,了解如何继续。