我有mainData,它是一个字典数组(原始数据),mainDataReferenceOrdered,mainDatanameOrdered和mainDataQuantiteOrdered是包含与mainData相同数据的其他数组(指向相同的元素).
dataToDisplay是控制器当前指向有序数据的数组指针.
重新排序时,我只是更改集合视图批处理中的数据,如下所示:
[itemCollectionControl.collectionView performBatchUpdates:^{ dataToDisplay = mainDataReferenceOrdered; //or any other ordered array [itemCollectionControl.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,itemCollectionControl.collectionView.numberOfSections)]]; } completion:^(BOOL finished) {}];
但是,即使它们已经可见,或者在正确的位置,该集合也会消失所有细胞.
我读了Apple documentation on UICollectionView,但我不知道我错过了什么.
我还阅读了other threads,但仍在寻找我必须做的事情.
批处理看起来知道要在单元格上应用哪个动画?
我的解决方案
这是我使用的最终代码,当然是我最接近的iOS编程指南.
[itemCollectionControl.collectionView performBatchUpdates:^{ NSArray *oldOrder = dataToDisplay; dataToDisplay = mainDatanBContainersOrdered; for (NSInteger i = 0; i < oldOrder.count; i++) { NSIndexPath *fromIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; NSInteger j = [dataToDisplay indexOfObject:oldOrder[i]]; NSIndexPath *toIndexPath = [NSIndexPath indexPathForRow:j inSection:0]; [itemCollectionControl.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath]; } } completion:^(BOOL finished) { if (finished) { [itemCollectionControl.collectionView reloadData]; } }];
我只是浏览所有旧的有序项目,检查它们的新位置,并将其应用于 – [UICollectionView moveItemAtIndexPath:toIndexPath:]
还有一些重复的细胞故障,但它在iOS7上看起来很好(不在iOS6上).
在iOS7上完成可能没用,我在iOS6改组的最后强制执行正确的顺序.
编辑
我想我找到了一个解决方案,但我无法再对该项目进行测试.也许只添加2行代码就可以解决这个可怕的故障.
在调用之前 – [UICollectionView moveItemAtIndexPath:toIndexPath:],调用 – [UICollectionView beginUpdates],最后在所有移动之后 – [UICollectionView endUpdates].
如果有人能够测试它发现它有效,请告诉我.
解决方法
[itemCollectionControl.collectionView performBatchUpdates:^{ for (NSInteger i = 0; i < mainDataReferenceOrdered.count; i++) { NSIndexPath *fromIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; NSInteger j = [mainDatanameOrdered indexOfObject:mainDataReferenceOrdered[i]]; NSIndexPath *toIndexPath = [NSIndexPath indexPathForRow:j inSection:0]; [itemCollectionControl.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath]; } } completion:^(BOOL finished) {}];
如果您有很多(数千个)项目,您可能需要考虑使用集合来加快查找速度.
更普遍适用的方法是使用类似TLIndexPathTools的东西,可以为您计算批量更新.看看Shuffle sample project.