【发布时间】:2020-06-07 18:48:10
【问题描述】:
我正在使用 CollectionView(VC1) 和 FRC 创建一个待办事项列表。
我首先在我的主页上显示 VC1(在另一个 CVC 的一部分中),项目限制设置为 3(如预览)。然后我有一个按钮,它显示 VC1 全屏 并显示项目的全部计数。
到目前为止,提取限制正常工作。但是,当我在 VC1 全屏 上时,我可以更新/删除项目,现在当我执行 collectionView.performBatchUpdates 时,我删除/更新项目以及视图的两个实例并相应地更新。但是……
如果我再添加 3 个项目,主页上的 VC1:限制不再是 3,而是 6。
如果我删除 2 个项目,主页上的 VC1:现在只显示 1 个项目,即使在 coreData 我还有另外 20 个项目。
似乎无论设置什么限制,我删除或插入多少个 collectionView 都会相应地更新。现在我应该记得每次都 fetch items 吗?
这里是一些关于我如何设置限制和更新 collectionView 的代码
lazy var fetchedResultsController: NSFetchedResultsController<TodoItem> = {
let context = CoreDataManager.shared.persistentContainer.viewContext
let request: NSFetchRequest<TodoItem> = TodoItem.fetchRequest()
request.sortDescriptors = [
NSSortDescriptor(key: "date", ascending: false)
]
request.fetchLimit = mode == .fullscreen ? .max : 3
let frc = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
frc.delegate = self
do {
try frc.performFetch()
} catch let err {
print(err)
}
return frc
}()
// Number of items in CV
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
let allItems = fetchedResultsController.sections?[section].numberOfObjects ?? 0
let numberOfRows = mode == .fullscreen ? allItems : min(allItems, 3)
return numberOfRows
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
itemChanges.append((type, indexPath, newIndexPath))
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
collectionView?.performBatchUpdates({
for change in self.itemChanges {
switch change.type {
case .insert:
self.collectionView?.insertItems(at: [change.newIndexPath!])
case .delete:
self.collectionView?.deleteItems(at: [change.indexPath!])
case .update:
self.collectionView?.reloadItems(at: [change.indexPath!])
case .move:
self.collectionView?.deleteItems(at: [change.indexPath!])
self.collectionView?.insertItems(at: [change.newIndexPath!])
@unknown default:
return
}
}
}, completion: { finished in
self.itemChanges.removeAll()
})
}
提前感谢您的帮助。
【问题讨论】: