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

时间:2015-02-05 22:13:02

标签: ios objective-c uitableview custom-cell heightforrowatindexpath

我有自定义UITableViewCell。我想访问单元格属性,即UILabel等。我尝试插入以下代码:

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

    return ...
}

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

永远不应该在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单元格,因此它将重用而不分配其他无用的单元格

答案 2 :(得分:1)

尝试注册您的自定义单元格类:

[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)];

}