无法生成具有旧节数的新节图:1和新节数:0与FetchedResultsController

时间:2017-08-17 13:49:42

标签: ios swift uitableview core-data swift3

在我的视图控制器中,我有一个已实现的fetchedResultsController,一切正常(显示行,几个部分,提取等)。

但我在尝试更新或删除部分的最后一行时遇到错误,(当我说"最后一行",我的意思是只有一个在该部分留下的一行)。如果该部分中有多行,当我更新它的值(在核心数据中)时,它会发生没有错误。我已经阅读了thisthisthis,但它没有帮助我(解决方案已经过时),而且我没有找到解决问题的方法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)

1 个答案:

答案 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
            }
        }