在我的视图控制器中,我有一个已实现的fetchedResultsController,一切正常(显示行,几个部分,提取等)。
但我在尝试更新或删除部分的最后一行时遇到错误,(当我说"最后一行",我的意思是只有一个在该部分留下的一行)。如果该部分中有多行,当我更新它的值(在核心数据中)时,它会发生没有错误。我已经阅读了this,this和this,但它没有帮助我(解决方案已经过时),而且我没有找到解决问题的方法StackOverflow和互联网上。我需要帮助。我使用Xcode 8.3.3和Swift 3。
以下是我尝试更新" Only"时出现的错误。 tableView的任何部分中的行:
CoreData: error: Serious application error.
An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.
UITableView internal bug: unable to generate a new section map with old section count:
1 and new section count: 0 with userInfo (null)
我使用此方法返回部分的数量:
func numberOfSections(in tableView: UITableView) -> Int {
return fetchedResultsController?.sections?.count ?? 0
}
这是获取行数的方法:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let sections = fetchedResultsController.sections {
let currentSection = sections[section]
return currentSection.numberOfObjects
}
return 0
}
我的视图控制器中还有以下方法:
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.tableView.beginUpdates()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.tableView.endUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .delete:
guard let path = indexPath
else { return }
tableView.deleteRows(at: [path],
with: .none)
case .insert:
guard let path = newIndexPath
else { return }
tableView.insertRows(at: [path],
with: .automatic)
case .move:
guard let _ = indexPath,
let _ = newIndexPath
else { return }
if indexPath != newIndexPath {
tableView.deleteRows(at: [indexPath!], with: .none)
tableView.insertRows(at: [newIndexPath!], with: .none)
}
case .update:
guard let path = indexPath
else { return }
tableView.reloadRows(at: [path], with: .none) // No blinking with .none
}
}
如果没有版块,我已尝试将numberOfSections方法更改为返回1个部分,
func numberOfSections(在tableView:UITableView中) - &gt; Int {
if self.fetchedResultsController.sections?.count == 0 {
return 1
} else {
return fetchedResultsController?.sections?.count ?? 1
}
}
但我在这种情况下遇到了另一个错误。
An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.
*** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds for empty NSArray with userInfo (null)
答案 0 :(得分:1)
经过一些尝试,我找到了解决方案:
添加此方法后,我没有错误:
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
switch type {
case .insert:
tableView.insertSections(NSIndexSet(index: sectionIndex) as IndexSet, with: .fade)
case .delete:
tableView.deleteSections(NSIndexSet(index: sectionIndex) as IndexSet, with: .fade)
case .move:
break
case .update:
break
}
}