Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UICollectionViewCell仅在查看时加载?_Ios_Swift_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

Ios UICollectionViewCell仅在查看时加载?

Ios UICollectionViewCell仅在查看时加载?,ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,我正在开发一个聊天应用程序,其中我有一个UICollectionView来控制消息,我遇到了一个我想与您确认的情况 例如,假设我在这个UICollectionView中有60个项目,但是根据项目的大小和我设置的滚动选项,只有最后10个项目在屏幕上可见,从50到59 基于此,例如,我似乎无法在IndexPath 30上获取cellForItem。对吗 在创建解决方案之前,我想与您确认一下,检查已经“在屏幕上”的项目,我需要检查。感谢您已经实施的任何想法和解决方案 此外,基于上述信息,例如,如果我需

我正在开发一个聊天应用程序,其中我有一个UICollectionView来控制消息,我遇到了一个我想与您确认的情况

例如,假设我在这个UICollectionView中有60个项目,但是根据项目的大小和我设置的滚动选项,只有最后10个项目在屏幕上可见,从50到59

基于此,例如,我似乎无法在IndexPath 30上获取cellForItem。对吗

在创建解决方案之前,我想与您确认一下,检查已经“在屏幕上”的项目,我需要检查。感谢您已经实施的任何想法和解决方案

此外,基于上述信息,例如,如果我需要将项目从索引路径30移动到31,如果它们没有在屏幕中“实例化”,我会有问题吗


提前谢谢

只有当单元格可见或不可见时,才可以访问该单元格。您需要使用
indepath
以编程方式滚动该单元格:-

collectionView.scrollToItem(at: yourIndexPath, at: UICollectionViewScrollPosition.top, animated: true)

只有当单元格可见或不可见时,才能访问该单元格。您需要使用
indepath
以编程方式滚动该单元格:-

collectionView.scrollToItem(at: yourIndexPath, at: UICollectionViewScrollPosition.top, animated: true)

根据你的问题。如果屏幕上当前可见的单元格从50到59,则IndexPath 30处的cellForItem将不可用。这将是零。原因是30个单元格已经被重新使用以显示50到59之间的一个单元格


将单元格从30移动到31不会有问题。只需更新阵列/数据源并重新加载集合视图

根据你的问题。如果屏幕上当前可见的单元格从50到59,则IndexPath 30处的cellForItem将不可用。这将是零。原因是30个单元格已经被重新使用以显示50到59之间的一个单元格


将单元格从30移动到31不会有问题。只需更新阵列/数据源并重新加载集合视图

您似乎混合了模型、控制器和视图类,这是一件坏事™ 这正是你在这里遇到的原因

我认为您试图从索引30(基本上)访问数据,并对自己说“嘿,我已经在第30个单元格中添加了它,所以我将使用集合视图的方法获取该单元格并从那里获取它”。这意味着,您基本上要求查看数据

这是行不通的,因为,正如其他人所指出的(但更间接地说),在任何给定的时刻,根本没有60个细胞。屏幕上基本上有尽可能多的单元格(加上一个或几个“缓冲区”单元格,这样在滚动过程中渲染就可以了,我记不起那个atm了)。这就是为什么
cellForItem(at:)
对于引用当前实际上不可见的单元格的
indepath
而言是nil。基本上,它的工作方式与表视图类似。由于内存原因,集合视图根本不保留不需要渲染的内容

如果您需要从该路径的单元格(毕竟也是一个视图)获取任何内容,为什么不从表示该单元格内容的任何数据对象获取?通常是
UICollectionViewDataSource

这就是这个范例的工作原理:
UICollectionViewDataSource
负责保存您的应用程序在给定时间可能需要的任何数据(这可能需要也可能不需要重新加载它或它的一部分,由您选择)。
UICollectionView
在某个
indepath
可见时使用其
collectionView(\uquo:cellForItemAt:)
方法,但它会再次丢弃该方法(或者再次对其进行排队,以便您的数据源可以在
collectionView(\uquo:cellForItemAt:)
中对其进行排队,并将其重新用于另一个可见的数据集)

顺便说一句,请不要使用
UICollectionViewDataSource
collectionView(u:cellForItemAt:)
方法获取单元格,然后从中获取数据。此方法应该由集合视图调用,并且取决于您如何重用或创建单元格,这可能会打乱整个过程。或者至少创建与视图相关的开销。相反,以
UICollectionViewDataSource
进入方法内部的相同方式获取数据。用你所依赖的其他方法或类似方法来包装它。或者,更好的是,依赖于控制器使用的模型对象


根据您的评论进行编辑:

不,我并不是说使用
UIViewController
作为
UICollectionViewDataSource
作为
UICollectionView
是不好的。我的意思是,使用
UICollectionView
获取数据是不好的,因为这就是数据源的用途。在你的问题中,你想知道为什么
cellForItem(在:)
给出零。该方法在
UICollectionView
上定义。你没有提到你的意图是移动物品(我马上会解释),所以我假设你是在尝试获取牢房里的任何数据(我知道,“假设让你和我变成一个傻瓜…”,对不起:)。这不是办法,因为
UICollectionView
不是用来为您保存数据的。相反,这是您的工作,您可以使用
UICollectionViewDataSource
来实现这一点。后一个类(或者更确切地说是一个类可以采用的协议)基本上是为
UICollectionView
提供一个接口来获取数据。它需要这样做,因为正如前面所说,它并没有保存所有的数据。它从数据源请求所需的内容。另一方面,数据源本身可以管理该数据,或者它可能依赖于某种更深层的类体系结构(即负责底层模型的其他对象)来实现这一点。那部分取决于你的设计。对于较小的场景,仅将数据源放在数组或字典中就足够了。此外,许多设计实际上使用