NSFetchedResultsController
Car
(NSManagedObject
的子类,与 NSFetchedResultsController
的谓词)NSFetchedResultsControllerDelegate 检测到模型更改
,但问题是模型已更新,我需要表格 View 来匹配它。NSFetchedResultsControllerDelegate
会检测模型更改,我可以使用委托(delegate)方法进行更新。引用:https://developer.apple.com/documentation/coredata/nsfetchedresultscontrollerdelegate
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 移出)。'
感谢@Jake 和@pbasdf,他们的建议帮助我发现并纠正了问题。
我正在回答完整性。
我的表格 View 中有多个部分,我将行插入错误的部分。因此,当模型发生变化时,相关部分中的表格 View 行数并没有发生变化。
我觉得将结果转换成一个数组并使用数组作为数据源而不是 NSFetchedResultsController
来进行用户驱动的更新会更好。
当用户插入/删除/移动行时UITableViewDataSource
方法被调用:
tableView(_:commit:forRowAt
会被调用tableView(_:moveRowAt:to
会被调用更新核心数据会导致NSFetchedResultsControllerDelegate
被调用
controller(_:didChange:at:for:newIndexPath
中执行以下操作:
controllerDidChangeContent(_
调用 tableView.reloadData()
延迟 0.5 秒。当用户在 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/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |