所以我跟着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;
答案 0 :(得分:3)
将reloadSections:withRowAnimation:
与UITableViewRowAnimationNone
一起使用实际上为我解决了问题,并且在添加/删除部分的单元格时仍然显示动画。
我仍然相信,这是UIKit中的一个错误。
答案 1 :(得分:0)
细胞正在消失,因为有些东西正在改变它的框架,最终它会被拉出屏幕。
如果图像的大小发生变化,则图像视图本身会设置为自动调整大小,而tableview单元格的内容视图也会这样做,这可能会导致单元格的帧根据图像加载的顺序进行迁移。