Ios 为什么UICollectionView.cellForItemAtIndexPath总是调用UICollectionViewDatasource.cellForItemAtIndexPath?

Ios 为什么UICollectionView.cellForItemAtIndexPath总是调用UICollectionViewDatasource.cellForItemAtIndexPath?,ios,uicollectionview,Ios,Uicollectionview,场景:我想检查特定可见UICollectionViewCells的选定状态,其中indexPath是我在UICollectionView引用上调用cellForItemAtIndexPath的对象 问题:调用UICollectionView.cellForItemAtIndexPath总是调用UICollectionViewDatasource.cellForItemAtIndexPath,它返回一个没有选择状态的新单元格 问题:为什么UICollectionView.cellForItemAt

场景:我想检查特定可见UICollectionViewCells的选定状态,其中indexPath是我在UICollectionView引用上调用cellForItemAtIndexPath的对象

问题:调用UICollectionView.cellForItemAtIndexPath总是调用UICollectionViewDatasource.cellForItemAtIndexPath,它返回一个没有选择状态的新单元格

问题:为什么UICollectionView.cellForItemAtIndexPath总是调用UICollectionViewDatasource.cellForItemAtIndexPath

苹果文档称返回值为“相应索引路径处的单元格对象,如果单元格不可见或indexPath超出范围,则返回值为零。”

我是否遗漏了什么,或者我在数据源中对cellForItemAtIndexPath的实现不正确

- (UICollectionViewCell*) collectionView: collView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

SudoCell *cell = [collView dequeueReusableCellWithReuseIdentifier:CELL_ID forIndexPath:indexPath];
[cell setValuesWithSection:indexPath.section item:indexPath.item modelObject:_model];
cell.backgroundColor =  [UIColor whiteColor];

return cell;
}

作为一种解决方法,目前我正在设置将节值和项值存储为单元格的实例值。循环遍历所有可见单元格,以查找具有节和项值的匹配单元格,并检查可见状态。当细胞数量巨大时,这就变得单调乏味了


请给出建议。

您误解了协议和代理的工作方式。cellForItemAtIndexPath:是UICollectionView和UITableView调用其数据源以填充集合或表视图的委托方法

假设你有一个CollectionView,你给了它一个数据源。在运行应用程序时,CollectionView将调用datasource numberOfSectionsInCollectionView:上的方法,以获取CollectionView需要多少节

然后调用collectionView:numberOfItemsInSection以获取集合中每个部分的项目。对于集合视图中定义的每个单独部分,都会调用此方法

最后,它调用collectionView:cellForItemAtIndexPath:以获取集合中每个项目的单元格。对于集合视图中定义的每个单独项,都会调用此方法。在这里,您可以通过编程方式配置单元格以显示所需的信息,例如,如果您希望为集合提供一个附加了图像的单元格,则可以在这里执行此操作

这些都是数据源方法,其唯一责任是为集合视图提供数据。如果要响应用户交互,则需要使用UICollectionViewDelegate协议并实现这些方法

collectionView:didSelectItemAtIndexPath:

collectionView:DidDeceloseItemAtIndexPath:

正如签名所暗示的那样,调用这些方法是为了响应对集合执行的操作,同时调用一个IndexPath,该IndexPath描述了对该操作执行的单元格的节和项号

上面的UICollectionDelegate协议参考可用于响应该视图中发生的不同事件


但是,如果您对协议和委托没有基本的了解,那么上述信息对您没有任何用处。我建议在继续之前先花点时间加强这种理解

谢谢你的评论,Literphor。在这种情况下,你还没有回答我的问题。我想我没有误解,请你解释一下。UICollectionView上有一个名为cellForItemAtIndexPath的方法,UICollectionViewDatasource上有一个名为cellForItemAtIndexPath的方法,需要由开发人员实现。根据Apple引用,UICollectionView上cellForItemAtIndexPath返回的值表示可见单元格,而不是新构造的单元格。您将如何决定使用indexPath获取可见单元格的引用以检查其所选状态?如果您仔细阅读我的答案并真正理解我的意思(这意味着理解协议和委托),那么您将看到我已经回答了您的问题。正如我所说,CellForIndexPath是UITableView和UICollectionView在数据源上调用的一种方法,用于获取特定项的单元格。在这里,您可以通过编程方式配置该单元格的外观以及该表用于该特定项的单元格。如果您想随时获取某个特定单元格的状态,则需要保留对表中给定单元格的引用。否则,如果要在用户在表视图中选择项时响应,则需要使用委托方法,如tableView:shouldSelectRow:。它将在用户选择行时调用,并提供有关选择发生在哪个tableview上以及该项所在的索引路径(即节和行)的信息