【发布时间】:2012-03-27 19:33:32
【问题描述】:
我在这里有一个简单的示例项目:
http://dl.dropbox.com/u/7834263/ExpandingCells.zip
在这个项目中,一个 UITableView 有一个自定义的 UITableViewCell。每个单元格中有 3 个 UIView,其中包含一个标签。
目标是在点击时展开单元格,然后在再次点击时将其折叠。单元格本身必须改变它的高度以暴露子视图。插入或删除行是不可接受的。
演示项目几乎按预期工作。事实上,在 iOS 4.3 中它可以完美运行。然而,在 iOS 5 下,当行折叠时,之前的单元格会神奇地消失。
要重现问题,请在模拟器或装有 iOS 5 的设备中运行项目,然后点击第一个单元格以展开它。然后再次点击单元格以折叠它。最后,点击其正下方的单元格。前一个消失了。
继续点击该部分中的每个单元格将导致所有单元格消失,直到整个部分丢失。
我也尝试过使用 reloadData 代替当前设置,但这会破坏动画并且感觉有点像 hack。 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 方法。
【问题讨论】:
-
在 JVCell 中覆盖 setAlpha: 以阻止 setAlpha:0 似乎是一种解决方法,我没有看到任何负面影响,但它很难看。我会继续戳它,看看我能不能弄清楚它为什么要隐藏单元格。
-
我有一个类似的例子你想要吗?
-
如果它做同样的事情,当然。它需要有背景图像,并在扩展时更改单元格高度。它不能添加或删除单元格。它也必须是动画的。您可以将其发布在答案中并添加源代码或链接。您的代码有何不同之处?
标签: iphone objective-c ios uitableview