OGeek|极客世界-中国程序员成长平台

标题: ios - NSFetchedResultsController - 用户驱动的更改 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 19:48
标题: ios - NSFetchedResultsController - 用户驱动的更改

概述

问题:

注意:

引用:https://developer.apple.com/documentation/coredata/nsfetchedresultscontrollerdelegate

NSFetchedResultsController 的创建:

let fetchRequest : NSFetchRequest<Car> = Car.fetchRequest()

fetchRequest.predicate = NSPredicate(format: "color = %@", argumentArray: ["green"])

let orderIDSortDescriptor = NSSortDescriptor(keyPath: \Car.price, ascending: true)

fetchRequest.sortDescriptors = [orderIDSortDescriptor]

fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,
                                                      managedObjectContext: context,
                                                      sectionNameKeyPath: nil,
                                                      cacheName: nil)

编辑风格

override func tableView(_ tableView: UITableView,
                        editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {

    let newCarIndex = fetchedResultsController?.fetchedObjects?.count ?? 0

    let editingStyle : UITableViewCellEditingStyle

    switch indexPath.row {

    case newCarIndex:
        editingStyle = .insert

    default:
        break            
    }

    return editingStyle
}

提交用户操作

override func tableView(_ tableView: UITableView,
                        commit editingStyle: UITableViewCellEditingStyle,
                        forRowAt indexPath: IndexPath) {

    switch editingStyle {

    case .insert:
        createGreenCar(at: indexPath) //Creating a new Car with color = Green
        tableView.insertRows(at: [indexPath], with: .automatic) //This causes the app to crash
    default:
        break
    }
}

崩溃错误信息:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 1 节中的行数无效。更新后现有节中包含的行数 (1) 必须等于更新前该节中包含的行数 (1),加上或减去从该节插入或删除的行数(1 插入,0 删除),加上或减去移入或移出该节的行数( 0 移入,0 移出)。'



Best Answer-推荐答案


感谢@Jake 和@pbasdf,他们的建议帮助我发现并纠正了问题。

我正在回答完整性。

根本原因:

我的表格 View 中有多个部分,我将行插入错误的部分。因此,当模型发生变化时,相关部分中的表格 View 行数并没有发生变化。

接近用户驱动的更新:

1。使用数组

我觉得将结果转换成一个数组并使用数组作为数据源而不是 NSFetchedResultsController 来进行用户驱动的更新会更好。

2。使用 NSFetchedResultsController:

当用户插入/删除/移动行时UITableViewDataSource方法被调用:

更新核心数据会导致NSFetchedResultsControllerDelegate被调用

注意:

当用户在 iOS 11.2 上移动该行(使用 NSFetchedResultsController)时,我确实遇到了以下警告:

UITableView internal inconsistency: _visibleRows and _visibleCells must be of same length. _visibleRows

我不知道如何解决它,所以暂时坚持使用数组实现。

关于ios - NSFetchedResultsController - 用户驱动的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49070451/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4