我有一个UICollectionView,它使用NSFetchedResultsController显示CoreData中的实体。正如您在屏幕截图中看到的,用户可以选择多个标有边框的单元格。
我的模型基本上只有一个字符串和一个布尔值,用于通过UICollectionView处理选择。
var url: String
var selected: Bool
var section:Section
我已实施func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)
以支持UICollectionViewCells
的重新排序。拖放操作工作正常,但我正在努力将移动的项目保存到CoreData。我是否必须在模型中添加position
属性?
func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
var sourceArray = self.fetchedResultController.fetchedObjects
let item = sourceArray?.remove(at: sourceIndexPath.item)
sourceArray?.insert(item!, at: destinationIndexPath.row)
coreData.saveContext()
}
我尝试直接修改fetchedResultsController.fechtedObjects
,因为此属性是只读的,所以不会这样做。使用UICollectionView
和NSFetchedResultsController
拖放的最佳方式是什么。
编辑:
UICollectionView
的初始排序基于Section
模型中的索引属性。目前,这些部分只有这个排序键,没有任何部分内的项目。
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "section.index", ascending: false)]
let resultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath:"section.name", cacheName: nil)
答案 0 :(得分:2)
正如您所发现的,您不能告诉NSFetchedResultsController
更改其fetchedObjects
数组中对象的顺序。该数组根据您的排序描述符进行排序,并且是只读的。
所以你有两种可能的选择:
NSFetchedResultsController
委托方法将触发。您已更改了订单,您获取的结果控制器将在其fetchedObjects
数组中反映出来。NSFetchedResultsController
,只需进行提取并将结果保存在您自己的数组中。重新订购您自己的阵列中的项目,但不要更改Core Data关心的任何内容。