在 heightForRowAtIndexPath 中访问自定义单元格属性

Access custom cell properties in heightForRowAtIndexPath

我有一个习惯UITableViewCell。我想访问单元格属性,即 UILabel 等。我尝试插入以下代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CategorieCell *customCell = (CategorieCell *)[tableView cellForRowAtIndexPath:indexPath];

    return ...
}

当我 运行 应用程序时,它崩溃了,但没有提供错误详细信息。问题出在我正在创建的新 customCell 上。还有其他方法可以访问 customCell.m 对象吗?

关于崩溃,请注意您正在使用 cellForRowAtIndexPath: 这是您必须实现的 UITableViewDatasource 中的一个方法,该方法默认调用 heightForRowAtIndexPath,因此它将成为一个递归的

我假设您希望在此方法中使用自定义单元格,以便从中获取高度。 实现此目的的最佳方法是在 CategorieCell 上编写一个 class 方法,它为您提供具有特定数据的单元格的高度。

其他选项是使用代码提取方法,例如获取 uitableviewcell

(CategorieCell*) categorieCellForIndex:(NSIndex)index selected:(BOOL)selected{
...
}

heightForRowAtIndexPath 中永远不应称为 cellForRowAtIndexPath

第一个在第二个之前调用,如果您需要访问标签(例如计算文本的高度),您通常可以初始化一个单元格。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static CategorieCell *cell;
    if (!cell) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
        cell.frame = CGRectMake(0, 0, tableView.frame.size.width-tableView.contentInset.left-tableView.contentInset.right, cell.frame.size.height);
        [cell layoutIfNeeded];
    }

    cell.label.text = myDatasourceText;

    CGFloat cellHeight = ....

    return cellHeight;
}

注 1: 我使用 dequeueReusableCellWithIdentifier 假设你正在使用 Interface Builder,否则你需要使用 alloc] initWithStyle:...];

注2: 如您所见,我正在设置单元格的框架。这是必需的,否则您的单元格将默认为 (320 x 44)。你可能在 iPhone 6/6+ (i.e. screen width: 414)iPad 中,你可能需要根据他的宽度和他的文本来计算标签的高度,因此你需要设置标签的框架细胞.

注 3: 我假设你有一组相同的单元格结构,因此我使用了一个 static 单元格,所以它将 重用 而不会分配其他无用的单元格。

尝试像这样注册您的自定义单元 class:

[self.tableView registerClass:[CategorieCell class] forCellReuseIdentifier:NSStringFromClass([CategorieCell class]);

然后在 -tableView:heightForRowAtIndexPath: 中执行如下操作:

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

}