IOS 在多个表行中使用相同的视图/引用

Posted

技术标签:

【中文标题】IOS 在多个表行中使用相同的视图/引用【英文标题】:IOS using same view/reference in multiple table rows 【发布时间】:2015-06-24 18:29:43 【问题描述】:

奇怪的是,我在任何地方都找不到有关此主题的任何内容。

基本上,我有一个简单的 UITableView,比如说 10 行。每行都有一个与之关联的用户,每个用户都有一个“个人资料图片”。现在假设每一行是由 2 个用户中的 1 个创建的,因此它将在每一行中显示 2 个不同的个人资料图片中的 1 个。

我正在努力提高内存效率,所以我不想在新的 UIImageView 中加载相同的图像 5 次。因此,我尝试在同一用户的每一行中使用完全相同的 UIImageView 引用,但似乎只有加载的最后一行显示了 ImageView。例如,如果屏幕外的一行变得可见并重新加载,则该行的图像将出现在该行并从之前出现的行中消失。

所以我的问题是,我该怎么做?

A.我正在尝试做的事情/我错过的事情的解决方案

B.如果我在新的 UIImageView 中使用它,ios 将不会再次将相同的图像加载到内存中,所以我只是在浪费时间担心这个

C.一个让我大吃一惊的新解决方案

谢谢!

史蒂夫

*注意,我在 Xamarin/Mono 中构建它,但我不认为 C# 与 Objective C 在这种情况下会有所不同

【问题讨论】:

一个视图只能有一个超级视图,因此将其作为子视图添加到第二个单元格会将其从原始单元格中删除。 【参考方案1】:

UIImage 具有内置缓存,因此选项 B 很可能是您的解决方案。由于这个缓存,可能不需要在每个UIImageView 中保留一个UIImage 实例以供使用。虽然这种方法可能会稍微加快您的应用程序,但更有可能是premature optimization。

此外,UITableView 经过高度优化,可重复使用移出屏幕的单元格,因此您将拥有与可见 UITableViewCells 一样多的 UIImageView 实例。

您的问题是由于UIViews 一次最多只能有一个超级视图。因此,每次您将单个实例添加到单元格时,它都会从前一个单元格中删除自己。这就是为什么你只在最后一个单元格上看到它的原因。

【讨论】:

有关UIImage 缓存的更多信息,请参阅此问题。 ***.com/questions/8270277/…【参考方案2】:

我认为你误解了 iOS 是如何绘制图像的。您将需要在显示图像的每个位置创建多个 UIImageViews,但您可以(并且应该)重用您的 UIImage 对象,这才是真正消耗内存的原因。

因此,在您的 cellForRowAtIndexPath 方法中,只需创建一个 imageView 并将其设置为您已经加载的图像。

重用图像,而不是图像视图。

【讨论】:

这是我最初的想法,但这是我的问题。如果图像尚未保存在本地,我将异步下载它。所以我的表加载了所有行,然后当下载图像时,它需要将图像填充到将显示该图像的所有行的图像视图中。如果我为每个图像视图使用相同的图像(空白),当我在下载图像后更新图像时,它将是一个新图像,并且不再被图像视图引用。对不起,我可能想得太苦了,我自己都糊涂了。 我看到了你的问题。图真的有那么大吗?我不会异步加载单个图像。 这真的不是图片的大小,而是有多少。因此,正常情况可能是 1 或 2,因为在第一次下载后我将它们保存在本地。但是说有人删除了我的应用程序并重新安装它。他们将不得不一次重新下载所有图像。图像很小,但从我的服务中检索用户数据已经需要大约 2 秒,我不想再把它放大。试图瘦下来。编辑:通过检索,我的意思是登录过程,这是需要发生的地方。 也许我会在图像到达时发送通知,并且任何活表行都可以重新抓取图像。 感谢您的意见,斯科特。我最终在所有显示相同用户图像的 UIImageViews 之间共享 UIImage,就像你建议的那样。图像完成异步下载后,我只会使用该用户名发布通知,因此任何显示该用户图像的表格行都会将其 UIImageView 更新为刚刚下载的新图像。

以上是关于IOS 在多个表行中使用相同的视图/引用的主要内容,如果未能解决你的问题,请参考以下文章

在外部函数swift中使用表行中的indexPath

iOS:使用多个相同的视图控制器处理多个 uilocalnotification

iOS、iPad - 具有相同主视图控制器和详细视图控制器的多个拆分视图控制器

每个分段表行的附件视图中的 UISwitch

按钮到相同的视图 ios

iOS - 创建多个延时实时摄像机预览视图