【问题标题】:Why UICollectionView.cellForItemAtIndexPath always calls UICollectionViewDatasource.cellForItemAtIndexPath?为什么 UICollectionView.cellForItemAtIndexPath 总是调用 UICollectionViewDatasource.cellForItemAtIndexPath?
【发布时间】:2014-06-04 17:42:00
【问题描述】:

场景:我想使用 indexPath 检查特定可见 UICollectionViewCells 的选定状态,我在 UICollectionView 参考上为其调用 cellForItemAtIndexPath。

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

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

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

是我遗漏了什么还是我在数据源中的 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;

}

作为当前的解决方法,我将部分和项目值存储为单元格的实例值。循环遍历所有可见单元格以查找与部分和项目值匹配的单元格并检查可见状态。当细胞数量很大时,这变得很乏味。

请指教。

【问题讨论】:

    标签: ios uicollectionview


    【解决方案1】:

    您误解了协议和委托的工作方式。 cellForItemAtIndexPath:是 UICollectionView 和 UITableView 在其数据源上调用以填充 Collection 或 Table View 的委托方法。

    假设你有一个 CollectionView 并且你给了它一个数据源。在某些时候,当您运行应用程序时,CollectionView 将在数据源 numberOfSectionsInCollectionView 上调用一个方法:以获取 CollectionView 需要多少个部分

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

    最后它调用collectionView:cellForItemAtIndexPath: 以获取集合中每个项目的单元格。为集合视图中定义的每个单独项目调用此方法。您可以在此处以编程方式配置单元格以显示您想要的信息,例如,如果您想为集合提供一个附有图像的单元格,您可以在此处执行此操作。

    https://developer.apple.com/library/ios/documentation/uikit/reference/UICollectionViewDataSource_protocol/Reference/Reference.html

    这些都是数据源方法,仅负责为 Collection View 提供数据。如果你想响应用户交互,你需要使用 UICollectionViewDelegate 协议并实现方法

    collectionView:didSelectItemAtIndexPath:

    collectionView:didDeselectItemAtIndexPath:

    正如签名所暗示的,这些方法被调用以响应对集合执行的操作,以及描述执行操作的单元格的部分和项目编号的 IndexPath。

    https://developer.apple.com/library/ios/documentation/uikit/reference/UICollectionViewDelegate_protocol/Reference/Reference.html

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

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

    【讨论】:

    • 感谢您的评论,Literphor。鉴于这种情况,您还没有回答我的问题。我想我没有误解,用你的解释验证了。在 UICollectionView 上有一种名为 cellForItemAtIndexPath 的方法,在 UICollectionViewDatasource 上有一种同名的方法,需要由开发人员实现。根据 Apple 参考,由 UICollectionView 上的 cellForItemAtIndexPath 返回的值暗示了一个可见的单元格,而不是一个新构建的单元格。您将如何解决使用 indexPath 获取可见单元格的引用以检查其选定状态?
    • 如果您仔细阅读我的回答并真正理解我在说什么(这意味着理解协议和代表),那么您会看到我已经回答了您的问题。正如我所说,CellForIndexPath 是 UITableView 和 UICollectionView 在数据源上调用的方法,以便获取特定项目的单元格。您可以在此处以编程方式配置该单元格的外观以及表格用于该特定项目的单元格。如果您想随时获取特定单元格的状态,则需要保留对您提供的那些单元格的引用
    • 表。否则,如果您想在用户选择表格视图中的项目时做出响应,那么您需要使用委托方法,例如 tableView:shouldSelectRow:。每当用户选择一行时都会调用它,并将提供有关该选择发生在哪个 tableview 以及该项目所在的索引路径(即节和行)的信息
    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2014-04-12
    • 1970-01-01
    • 2012-09-28
    • 2010-10-15
    相关资源
    最近更新 更多