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的主要内容,如果未能解决你的问题,请参考以下文章