调整UITableViewCell高度的大小会导致最后更新时崩溃

时间:2012-07-16 15:10:21

标签: ios uitableview

我正在尝试调整UITableViewCell的高度,具体取决于显示的文本。我希望文本能够完整显示。

我在cellForRowAtIndexPath中创建了一个具有特定TEXT_CELL标签的单元格

if ([rowType isEqualToString:kTextCell] ) {

        cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

        // Create a text view;
        UITextView *newText = [[UITextView alloc] initWithFrame:CGRectZero];
        newText.backgroundColor = [UIColor blueColor];
        newText.tag = kNotesTag;
        newText.editable = NO;
        newText.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

        cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:newText];

        [newText release];
}

当我显示单元格时,我找出使用sizeOfFont函数显示所有文本所需的大小。然后我将该大小设置为变量,在heightOfCell函数中使用。

    UITextView *notes = (UITextView*) [cell viewWithTag:kNotesTag];

    if (notes != nil) {
        notes.text = [self.managedObject dispalyValueForKeyPath:rowKey];

        // resize it to the right height          
        CGRect contentFrame = cell.contentView.frame;

        CGSize textSize = [notes.text sizeWithFont:[UIFont systemFontOfSize:[UIFont systemFontSize]] 
                                 constrainedToSize:CGSizeMake(contentFrame.size.width, CGFLOAT_MAX) 
                                     lineBreakMode:UILineBreakModeWordWrap];   

        CGFloat newHeight = textSize.height + (CELL_CONTENT_MARGIN*2); //some space at the bottom

        CGFloat textHeight = self.storedTextHeight;            

        if (textHeight != newHeight) {

            [notes setFrame:CGRectMake(contentFrame.origin.x, 
                                       CELL_CONTENT_MARGIN+contentFrame.origin.y, 
                                       contentFrame.size.width, newHeight)];

            self.storedTextHeight = newHeight;

            // we reset the height fo the row, so reload it
            [tView beginUpdates];
            [tView endUpdates];  

        }

计算按预期工作,并调用heightForRow,并更新单元格高度。但是,我总是在[tView endUpdates]行获得SIGABT。

错误信息如下。我搜索了一堆,但不清楚为什么会这样。不创建或添加单元格。

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后现有部分中包含的行数(1)必须等于更新前的该部分中包含的行数(2),加上或减去从该部分插入或删除的行数(0插入,0删除)和加或减移入的行数或超出该部分(0移入,0移出)。'

感谢您对此有任何见解。

1 个答案:

答案 0 :(得分:1)

您的崩溃报告表明问题可能不是源于您的调整大小策略。它表示行数正在变化,但您不会自行更改行数。这是因为您重新加载表格的方式。

要重新加载表格视图,您应该只调用[tView reloadData]而不是-beginUpdates-endUpdates

如果您使用-beginUpdates-endUpdates,表格视图会认为您正在手动更改表格,即使用-deleteRowsAtIndexPaths:withRowAnimation:和批次。如果您没有这样做(如果您实际上没有自己进行任何更新,那么您不应该这样做),您应该只是致电-reloadData。如果您想使用-beginUpdates-endUpdates,则可以在两个调用之间插入:

[tView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:firstIndexPathToDelete, 
    someOtherIndexPathToDelete, maybeOneMoreIndexPathToDelete, nil] 
    withRowAnimation:UITableViewRowAnimationFade];
在致电-beginUpdates-endUpdates之间

编辑:

为了帮助-reloadData的表现,您需要确保在-cellForRowAtIndexPath:中没有做很多繁重的工作,并且还要重复使用单元格。互联网上有很多关于表格视图表现的文章:

How expensive is UITableView's reloadData?

reloadData in tableView makes performance slow

讨论here