使用 NSFetchedResultsController 委托方法将多行插入 tableView 时出现问题
Issues when inserting multiple rows into a tableView using NSFetchedResultsController delegate methods
所以我将 NSFetchedResultsController 用于始终增加 10 或任何可被 10 整除的数字的实体。我遇到的问题是在为 NSFetchResultsController 调用委托方法并插入行之后,tableView 将滚动到某个随机位置(通常朝向 table 的底部)。我不知道这是否是单元格高度(动态)的问题,或者单元格包含需要加载的图像这一事实,或者我是否处理了委托方法错误,或者我是否创建对象错误。任何帮助将不胜感激
此外,我正在使用 MoPub,因此 mp_
NSFetchedResultsControllerDelegate 方法
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.tableView.mp_beginUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case NSFetchedResultsChangeType.insert:
guard let insertIndexPath = newIndexPath else { return }
self.tableView.mp_insertRows(atIndexPaths: [insertIndexPath], with: .fade)
case NSFetchedResultsChangeType.delete:
guard let deleteIndexPath = indexPath else { return }
self.tableView.mp_deleteRows(atIndexPaths: [deleteIndexPath], with: .fade)
default:
break
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.tableView.mp_endUpdates()
}
插入方式
for index in 0..<posts.count {
let post = posts[index]
guard let _ = RecentPost.createInManagedObjectContext(context: context, post: post, sequence: index) else { continue }
}
createInManagedObjectContext
只是我用来插入新对象的方法,post.count
总是被除数10
由于我的单元格高度是动态的,我将 estimatedRowHeight
设置为 300,将其更改为 1000 似乎解决了我的问题。如果您知道除此之外的任何其他修复方法,或对我的代码的任何改进,请告诉我。谢谢
这就是我得出答案的原因。
编辑
我实际上仍然有问题,因为我正在响应多个更改,所以我只是使用 controllerDidChangeContent
委托方法并在它们中调用 tableView.reloadData()
。他们不是动画,但我正在做的没问题。
这也帮助我修复了它。
所以我将 NSFetchedResultsController 用于始终增加 10 或任何可被 10 整除的数字的实体。我遇到的问题是在为 NSFetchResultsController 调用委托方法并插入行之后,tableView 将滚动到某个随机位置(通常朝向 table 的底部)。我不知道这是否是单元格高度(动态)的问题,或者单元格包含需要加载的图像这一事实,或者我是否处理了委托方法错误,或者我是否创建对象错误。任何帮助将不胜感激
此外,我正在使用 MoPub,因此 mp_
NSFetchedResultsControllerDelegate 方法
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.tableView.mp_beginUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case NSFetchedResultsChangeType.insert:
guard let insertIndexPath = newIndexPath else { return }
self.tableView.mp_insertRows(atIndexPaths: [insertIndexPath], with: .fade)
case NSFetchedResultsChangeType.delete:
guard let deleteIndexPath = indexPath else { return }
self.tableView.mp_deleteRows(atIndexPaths: [deleteIndexPath], with: .fade)
default:
break
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.tableView.mp_endUpdates()
}
插入方式
for index in 0..<posts.count {
let post = posts[index]
guard let _ = RecentPost.createInManagedObjectContext(context: context, post: post, sequence: index) else { continue }
}
createInManagedObjectContext
只是我用来插入新对象的方法,post.count
总是被除数10
由于我的单元格高度是动态的,我将 estimatedRowHeight
设置为 300,将其更改为 1000 似乎解决了我的问题。如果您知道除此之外的任何其他修复方法,或对我的代码的任何改进,请告诉我。谢谢
这就是我得出答案的原因。
编辑
我实际上仍然有问题,因为我正在响应多个更改,所以我只是使用 controllerDidChangeContent
委托方法并在它们中调用 tableView.reloadData()
。他们不是动画,但我正在做的没问题。
这也帮助我修复了它。