使用IB创建的自定义单元格在调用reloadSections后隐藏:withRowAnimation:

时间:2010-11-27 21:12:22

标签: iphone ios uitableview uikit

所以我跟着this guide(“静态行内容技术”)来创建我自己的包含一个图像的自定义UITableViewCell。

以下代码摘自tableView:cellForRowAtIndexPath:方法:

UIImageView *imageView = (UIImageView *)[imageViewCell viewWithTag:1];
imageView.image = [UIImage imageNamed:imageName];
cell = imageViewCell;
NSLog(@"%@", cell);
...
return cell;

imageViewCell是指在界面构建器中创建的自定义单元格。正如你所看到的,我每次都试图改变图像。

一切正常,但如果我在UITableView上使用reloadSections:withRowAnimation:,则此单元格会消失。

这是控制台输出:

<UITableViewCell: 0x9c68fe0; frame = (0 0; 302 215); autoresize = RM+BM; layer = <CALayer: 0x4b88110>>
<UITableViewCell: 0x9c68fe0; frame = (0 120; 320 102); autoresize = W; layer = <CALayer: 0x4b88110>>
<UITableViewCell: 0x9c68fe0; frame = (-320 120; 320 102); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>>
<UITableViewCell: 0x9c68fe0; frame = (-320 121; 320 105); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>>
<UITableViewCell: 0x9c68fe0; frame = (-320 120; 320 111); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>>

因此,你可以看到它的帧和alpha被改为奇怪的值,并保持这样。

这是有道理的,因为我不是每次都重新初始化它,它只是在从笔尖中醒来后才初始化。

如何重置其属性以使其再次可见?我找到了名为prepareForReuse的方法,但这不起作用。我需要一些可以重置alpha和frame以使其再次出现的东西。


每次加载笔尖的解决方案

更清楚我的第一种方法:我在视图控制器的笔尖中创建了表视图单元格。我设置了一个插座,所以我可以在tableView:cellForRowAtIndexPath:中使用它。

由于在动画之后细胞的属性搞砸了,我认为重新创建该细胞肯定会有所帮助。问题是我的笔尖只加载了一次而且我(仍然)不知道如何在由nib文件初始化的视图上重新初始化。

所以我决定创建一个新的nib文件并每次加载它。这不是我想要的,但它确实有效。这是代码的样子,非常简单:

[[NSBundle mainBundle] loadNibNamed:@"TestTableCell" owner:self options:nil];
UIImageView *imageView = (UIImageView *)[imageViewCell viewWithTag:1];
imageView.image = [UIImage imageNamed:imageName];
cell = imageViewCell;
imageViewCell = nil; // imageViewCell is still an outlet and setting
                     // it to nil makes the nib load it again the next
                     // time - so I'm sure I'll get a new instance.
cell.selectionStyle = UITableViewCellSelectionStyleNone;

2 个答案:

答案 0 :(得分:3)

reloadSections:withRowAnimation:UITableViewRowAnimationNone一起使用实际上为我解决了问题,并且在添加/删除部分的单元格时仍然显示动画。

我仍然相信,这是UIKit中的一个错误。

答案 1 :(得分:0)

细胞正在消失,因为有些东西正在改变它的框架,最终它会被拉出屏幕。

如果图像的大小发生变化,则图像视图本身会设置为自动调整大小,而tableview单元格的内容视图也会这样做,这可能会导致单元格的帧根据图像加载的顺序进行迁移。