http://dl.dropbox.com/u/7834263/ExpandingCells.zip
在这个项目中,一个UITableView有一个自定义的UITableViewCell。每个单元格都包含3个包含标签的UIView。目标是在点击时扩展单元格,然后再次点击时折叠它。单元格本身必须更改其高度以公开子视图。插入或删除行是不可接受的。
演示项目几乎按预期工作。事实上,在iOS 4.3中,它的表现非常好。然而,在iOS 5下,当行折叠时,以前的单元格会神奇地消失。
要重新创建问题,请在模拟器或带有iOS 5的设备中运行该项目,然后点击第一个单元格以展开它。然后再次点击单元格以折叠它。最后,直接在其下方点击单元格。之前的单元格会消失。
继续点击该部分中的每个单元格将导致所有单元格消失,从而整个部分都消失了。
我还尝试使用reloadData而不是当前设置,但那会破坏动画效果,并且感觉有些像黑客。 reloadRowsAtIndexPaths应该起作用,但问题是为什么不起作用?
请参见下面的图像以查看发生的情况:
表格出现:
单元格扩展:
单元格折叠:
单元格消失(在点击其下方的单元格时):
重复执行,直到整个部分消失:
编辑: 覆盖alpha是一种hack方法,但有效。这里有另一种“hack”方法,也可以解决它,但为什么它会解决呢?
JVViewController.m第125行:
if( previousIndexPath_ != nil )
{
if( [previousIndexPath_ compare:indexPath] == NSOrderedSame ) currentCellSameAsPreviousCell = YES;
JVCell *previousCell = (JVCell*)[self cellForIndexPath:previousIndexPath_];
BOOL expanded = [previousCell expanded];
if( expanded )
{
[previousCell setExpanded:NO];
[indicesToReload addObject:[previousIndexPath_ copy]];
}
else if( currentCellSameAsPreviousCell )
{
[previousCell setExpanded:YES];
[indicesToReload addObject:[previousIndexPath_ copy]];
}
//[indicesToReload addObject:[previousIndexPath_ copy]];
}
编辑 2:
对演示项目进行了一些微小的更改,值得查看并审查JVViewController didSelectRowAtIndexPath方法。