iOS UICollectionView reloadData 错误地将模型映射到 ViewCell

Posted

技术标签:

【中文标题】iOS UICollectionView reloadData 错误地将模型映射到 ViewCell【英文标题】:iOS UICollectionView reloadData maps model to ViewCell incorrectly 【发布时间】:2013-01-04 03:43:51 【问题描述】:

如果NSArray 中的模型数据没有变化,而您在UICollectionView 上调用reloadData,单元格是否出现在不同的位置?

我发现如果我的NSArray 拥有 Obj1、Obj2、Obj3,那么首先,UICollectionView 正确地将 Obj1 映射到第一个 collectionViewCell,将 Obj2 映射到第二个等等。这就是它的设置方式在cellForRowAtIndexPath 中,因为它使用indexPath.row 从数组中获取正确的Obj。

但是,当我调用reloadData 时,所有对象都映射到了错误的 UICollectionViewCell(Obj1 最终位于其他位置,例如第二个 collectionViewCell,而 Obj2 最终成为第三个 collectionViewCell,等等)

为什么会这样?我在文档中没有找到原因。


此外,当我的模型数组发生更改时,我遇到了同样的问题。例如,如果我的NSArray 是 Obj1、Obj2、Obj3,然后创建了新的 Objs 实例并且现在以不同的顺序,例如 NSArray 是 Obj2、Obj3、Obj1... 然后我致电reloadData,我面临同样的问题。

Obj2 没有映射到第一个 UICollectionViewCell,而是映射到另一个 UICollectionViewCell

有人知道为什么UICollectionViews 会发生这种情况吗?

谢谢!

编辑:cellForRowAtIndexPath 的代码

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
MIAppCell* cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"MIAppCell" forIndexPath:indexPath];
// set model data
[cell setAppTitle:[(MIAppDO*)[self.apps objectAtIndex:indexPath.row] getAppTitle]];
return cell;

【问题讨论】:

显示您用于 collectionView 的代码:cellForItemAtIndexPath: 我看不出这段代码有什么问题。您可以尝试记录 indexPath 和 [(MIAppDO*)[self.apps objectAtIndex:indexPath.row] getAppTitle],看看它们是否给了您意想不到的东西。 我已经尝试过记录两者。它们给出了预期的结果,对于第一个单元格,indexPath.row 为 0,而 getAppTitle 来自数组的第一个对象(索引 0)。但是,UICollectionViewCell 没有显示正确的标题,它显示了数组中其他位置的另一个对象的标题。 我以前没有见过这种行为,所以我无法解释它。您可能希望在自定义单元格中发布代码。 感谢您指出我的自定义单元格的方向,我找到了答案 【参考方案1】:

我发现了问题。

之前,我是dequeuing 一个单元格并将其设置为新模型数据,但模型数据未正确反映在子类UICollectionViewCell 中。

我需要重写代表我的子类 UICollectionViewCell 的模型数据的属性的 setter 方法。在那些被覆盖的方法中,我能够更新单元格的适当视图。

【讨论】:

以上是关于iOS UICollectionView reloadData 错误地将模型映射到 ViewCell的主要内容,如果未能解决你的问题,请参考以下文章

IOS 瀑布流UICollectionView实现

iOS——UICollectionView

UICollectionView 部分标题崩溃 iOS 8

iOS-UICollectionView

iOS 6 和 iOS 7 上的 UICollectionView 重新加载

UICollectionView 像 iOS 主屏幕 [关闭]