我有一个可以在 2 种模式下工作的表格视图:只读和读写。在只读模式下,表格仅包含 4 个单元格,在读写模式下 - 8 个单元格。要在这两种模式之间转换,我有按钮执行操作:
...
NSArray* cellIndexesInCurrentMode = [self cellIndexesInMode:Mode1];
NSArray* cellIndexInNewMode = [self cellIndexesInMode:Mode2];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths: cellIndexInNewMode withRowAnimation:UITableViewRowAnimationFade];
[self.tableView deleteRowsAtIndexPaths:cellIndexesInCurrentMode withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
一切正常,直到我以读写(8 个单元格)向下滚动表格,所以它反弹了。之后,点击按钮转换到模式 2 会导致其中一个单元格未渲染的情况:
before transition:
after transition:
我的调查表明,由于某种原因,在 UITableView 上最后一次 layoutSubviews 调用之后,此单元格的 alpha = 0。
我被卡住了,我不知道发生了什么,所以任何帮助将不胜感激。
更新: 这是我的 cellForRowAtIndexPath 方法: - (UITableViewCell*) tableView :(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)cellForRowAtIndexPath { IDataSourceElement item = [[self collection] getDataSourceElementAtIndex:cellForRowAtIndexPath.row];
MyTableCell* cell = nil;
if ([item conformsToProtocol:@protocol(MyTableCellBuilder)]) {
cell = [(MyTableCellBuilder)item tableView:tableView buildCellForIndexPath:cellForRowAtIndexPath];
}
if (cell == nil) {
Class cellClass = [self getCellClassForElement: item];
NSString* reuseId = [cellClass description];
cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
if (!cell) {
cell = [[[cellClass alloc] initWithReuseIdentifier :reuseId] autorelease];
}
}
[self fillCell:cell forTableView:tableView forIndexPath:cellForRowAtIndexPath];
return cell;
}
和 MyTableCellBuilder buildCellForIndexPath: 方法实现
- (MyTableCell*) tableView :(UITableView*)tableView buildCellForIndexPath:(NSIndexPath*)buildCellForIndexPath {
MyTableCell* cell = myTableCell;
if ([cell isKindOfClass:[TextPropertyCell class]] == NO) {
cell = (MyTableCell*)[tableView dequeueReusableCellWithIdentifier :[self cellReuseIdentifier]];
if ([cell isKindOfClass:[MyTableCell class]] == NO) {
cell = [[[MyTableCell alloc] initWithReuseIdentifier :[self cellReuseIdentifier]] autorelease];
}
[self prepareCell:cell];
}
//cell setup
...
...
return cell;
}
我的想法是缓存 UITableViewCell 实例的问题,我知道这不是最好的方法,但无论如何我有它。我试图删除缓存,所以我所做的一切都是将 myTableCell 设置为 nil,因此它永远不会从此方法返回。而且......它有帮助!我不知道为什么,真的很想知道答案吗?