1

我有一个可以在 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,因此它永远不会从此方法返回。而且......它有帮助!我不知道为什么,真的很想知道答案吗?

4

1 回答 1

0

显示您的 cellForRowAtIndexPath 方法实现,我确定您应该在那里寻找错误。

于 2013-01-03T12:51:36.160 回答