Ios UICollectionViewCell仅在查看时加载?
我正在开发一个聊天应用程序,其中我有一个UICollectionView来控制消息,我遇到了一个我想与您确认的情况 例如,假设我在这个UICollectionView中有60个项目,但是根据项目的大小和我设置的滚动选项,只有最后10个项目在屏幕上可见,从50到59 基于此,例如,我似乎无法在IndexPath 30上获取cellForItem。对吗 在创建解决方案之前,我想与您确认一下,检查已经“在屏幕上”的项目,我需要检查。感谢您已经实施的任何想法和解决方案 此外,基于上述信息,例如,如果我需要将项目从索引路径30移动到31,如果它们没有在屏幕中“实例化”,我会有问题吗Ios UICollectionViewCell仅在查看时加载?,ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,我正在开发一个聊天应用程序,其中我有一个UICollectionView来控制消息,我遇到了一个我想与您确认的情况 例如,假设我在这个UICollectionView中有60个项目,但是根据项目的大小和我设置的滚动选项,只有最后10个项目在屏幕上可见,从50到59 基于此,例如,我似乎无法在IndexPath 30上获取cellForItem。对吗 在创建解决方案之前,我想与您确认一下,检查已经“在屏幕上”的项目,我需要检查。感谢您已经实施的任何想法和解决方案 此外,基于上述信息,例如,如果我需
提前谢谢 只有当单元格可见或不可见时,才可以访问该单元格。您需要使用
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
提供一个接口来获取数据。它需要这样做,因为正如前面所说,它并没有保存所有的数据。它从数据源请求所需的内容。另一方面,数据源本身可以管理该数据,或者它可能依赖于某种更深层的类体系结构(即负责底层模型的其他对象)来实现这一点。那部分取决于你的设计。对于较小的场景,仅将数据源放在数组或字典中就足够了。此外,许多设计实际上使用