调用 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 创建的自定义单元格被隐藏:的主要内容,如果未能解决你的问题,请参考以下文章

java三种调用方式(同步调用/回调/异步调用)

LINUX系统调用

引用调用 vs 复制调用调用

RPC 调用和 HTTP 调用的区别

js方法调用

深入理解Java虚拟机——方法调用(解析调用)