我正在尝试调整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移出)。'
感谢您对此有任何见解。
答案 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