调用 reloadSections:withRowAnimation 后,使用 IB 创建的自定义单元格被隐藏:
Posted
技术标签:
【中文标题】调用 reloadSections:withRowAnimation 后,使用 IB 创建的自定义单元格被隐藏:【英文标题】:Custom cell created with IB is hidden after calling reloadSections:withRowAnimation: 【发布时间】:2010-11-27 21:12:22 【问题描述】:所以我按照this guide(“静态行内容的技术”)创建了我自己的自定义 UITableViewCell-s,其中包含一个图像。
以下代码摘自我的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>>
所以你可以看到它的 frame 和 alpha 被更改为奇怪的值并保持不变。
这是有道理的,因为我不是每次都重新初始化它,它只在从 nib 唤醒后初始化一次。
如何重置其属性以使其再次可见?我找到了名为 prepareForReuse
的方法,但它不起作用。我需要一些可以重置 alpha 和 frame 以使其再次出现的东西。
每次加载笔尖的解决方案
为了更清楚地了解我的第一种方法:我在视图控制器的 nib 中创建了表格视图单元格。我设置了一个插座,所以我可以在tableView:cellForRowAtIndexPath:
使用它。
由于动画后单元格的属性被弄乱了,我认为重新创建该单元格肯定会有所帮助。问题是我的 nib 只加载了一次,我(仍然)不知道如何对由 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;
【问题讨论】:
【参考方案1】:将reloadSections:withRowAnimation:
与UITableViewRowAnimationNone
一起使用实际上为我解决了这个问题,它仍然会显示从部分添加/删除单元格的动画。
我仍然相信,这是 UIKit 中的一个错误。
【讨论】:
我有 2 行要插入/删除, UITableViewRowAnimationNone 让半行可见。【参考方案2】:单元格正在消失,因为某些东西正在改变它的框架,以至于它最终被拉出屏幕。
如果图像的大小发生变化,则图像视图本身会设置为自动调整大小,并且 tableview 单元格的内容视图也会这样做,这可能会导致单元格的框架根据图像加载的顺序进行迁移。
【讨论】:
关于如何解决此问题的任何建议?每次加载 nib 可能会有所帮助,因为这会重置单元格位置和所有内容。但我真的希望有更简单的解决方案。 我会进入 IB 并将图像视图设置为不自动调整大小。如果您需要调整大小,您可能需要在设置图像之前手动执行此操作。以上是关于调用 reloadSections:withRowAnimation 后,使用 IB 创建的自定义单元格被隐藏:的主要内容,如果未能解决你的问题,请参考以下文章