如何将自定义单元格数据中的更改从didSelectRowAtIndexPath传递到heightForRowAtIndexPath

时间:2011-12-23 20:08:24

标签: objective-c ios cocoa-touch uitableview

如果它已经扩展,我试图让细胞崩溃。此代码在单击时展开行,但bool cell.cell_expandedheightForRowAtIndexPath中始终为FALSE。我已经尝试了[tableView reloadData]但是没有做到这一点。有什么想法吗?

我读到使用heightForRowAtIndexPath会对性能产生巨大影响,所以如果可能的话,我想删除此方法调用。是否有可能在其他地方重构此功能?

这就是我所拥有的:

CustomCell.h

@interface CustomCell : UITableViewCell
{
    UIImageView *cell_arrow;
    BOOL cell_expanded;
}
@property (nonatomic, strong) UIImageView *cell_arrow;
@property (nonatomic) BOOL cell_expanded;

FirstViewController.m

-(void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    selectedCellIndexPath = indexPath;

    CustomCell *cell = (CustomCell *)[tv cellForRowAtIndexPath:indexPath];

    NSString *arrow = nil;
    if (cell.cell_expanded == TRUE) {
        arrow = @"arrow_down.png";
        cell.cell_expanded = FALSE;
    }
    else {
        arrow = @"arrow_up.png"; 
        cell.cell_expanded = TRUE;
    }
    cell.cell_arrow.image = [UIImage imageNamed:arrow];

    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

-(CGFloat)tableView:(UITableView *)tv heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = (CustomCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath];
    if (selectedCellIndexPath != nil) {
        if (indexPath.row == selectedCellIndexPath.row) {
            NSLog(@"cell_expanded = %d for row %i", cell.cell_expanded, indexPath.row);
            CGSize theSize = [cell.cell_body.text sizeWithFont:[UIFont systemFontOfSize:12.0f] constrainedToSize:CGSizeMake(265.0f, 9999.0f) lineBreakMode:UILineBreakModeWordWrap];
            if (cell.cell_expanded == TRUE) {
                NSLog(@"open it");
                return theSize.height + 16;
            } else {
                NSLog(@"close it");
                return 44;
            }
        }
        else {
            return 44;
        }
    }
    return 44;
}

1 个答案:

答案 0 :(得分:-1)

好的,这里有几件事:

1)只需调用-reloadData而不是-end / beginUpdates。 2)你显然不明白UITableView是如何工作的。 UITableView重用其单元格。这意味着你可能有5个单元格实例。您应该阅读documents有关它的内容。要解决您的问题,您应该将扩展变量保存在UITableView表示的实例变量中。