重新排序 UICollectionView + NSFetchedResultsController 中的单元格
Reorder cells in UICollectionView + NSFetchedResultsController
我有一个 UICollectionView,它使用 NSFetchedResultsController 显示来自 CoreData 的实体。正如您在屏幕截图中看到的,用户可以 select 多个单元格,这些单元格带有边框。
我的模型基本上只有一个字符串和一个布尔值,用于通过 UICollectionView 处理 selection。
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)
如您所见,您不能只告诉 NSFetchedResultsController
更改其 fetchedObjects
数组中对象的顺序。该数组根据您的排序描述符排序,并且是 read-only.
所以你有两个可能的选择:
- 更改您在排序描述符中使用的 属性,以便新的排序结果与拖放操作的结果相匹配。保存更改,
NSFetchedResultsController
委托方法将触发。您已经更改了顺序,您的获取结果控制器将在其 fetchedObjects
数组中反映出来。
- 不要使用
NSFetchedResultsController
,只需执行一次提取并将结果保存在您自己的数组中。 Re-order 您自己数组中的项目,但不要更改 Core Data 关心的任何内容。
我有一个 UICollectionView,它使用 NSFetchedResultsController 显示来自 CoreData 的实体。正如您在屏幕截图中看到的,用户可以 select 多个单元格,这些单元格带有边框。
我的模型基本上只有一个字符串和一个布尔值,用于通过 UICollectionView 处理 selection。
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)
如您所见,您不能只告诉 NSFetchedResultsController
更改其 fetchedObjects
数组中对象的顺序。该数组根据您的排序描述符排序,并且是 read-only.
所以你有两个可能的选择:
- 更改您在排序描述符中使用的 属性,以便新的排序结果与拖放操作的结果相匹配。保存更改,
NSFetchedResultsController
委托方法将触发。您已经更改了顺序,您的获取结果控制器将在其fetchedObjects
数组中反映出来。 - 不要使用
NSFetchedResultsController
,只需执行一次提取并将结果保存在您自己的数组中。 Re-order 您自己数组中的项目,但不要更改 Core Data 关心的任何内容。