NSFetchedResultsController 的 tableView 中的不同部分与核心数据记录中的部分不同
Different sections in tableView from NSFetchedResultsController than in Core Data records
我有 2 个实体:Products
和 Package
产品具有 name,weight,price
并且与包装的关系 pack
->对许多
包有 name
,我将它用于我的 tableView 中的部分。
产品是用 textFields 创建的,tableView 是用 [Package]
填充的。在核心数据中,我将 pack
记录为 selectedRow Package
,但是当我使用 Products
打开 tableView 时,产品位于不同的包(部分)中,而不是我在 [=13 的 tableView 中选择的=]
核心数据的结果:
"prod4"
<Packings: 0x2817a5770> (entity: Packings; id: 0xbf7e2ae6e8ae5fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p1>; data: <fault>)
"prod3"
<Packings: 0x2817b2cb0> (entity: Packings; id: 0xbf7e2ae6e8a65fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p3>; data: <fault>
"prod2"
<Packings: 0x2817b2d50> (entity: Packings; id: 0xbf7e2ae6e8a25fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p2>; data: <fault>)
"prod1"
<Packings: 0x2817a5770> (entity: Packings; id: 0xbf7e2ae6e8ae5fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p1>; data: <fault>)
如您所见,prod1、prod2、prod3 应引用 pack1、pack2、pack3,在打印中描述为 p1、p2、p3。 prod4 被引用到 p1。但它们在 Products tableView 中的排列完全不同:
代码:
let fetchRequest:NSFetchRequest<Products> = Products.fetchRequest()
fetchRequest.returnsObjectsAsFaults = false
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "productId", ascending: false)]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: (UIApplication.shared.delegate as? AppDelegate)!.persistentContainer.viewContext, sectionNameKeyPath: "pack.name", cacheName: nil) as? NSFetchedResultsController<NSFetchRequestResult>
fetchedResultsController!.delegate = self
try fetchedResultsController!.performFetch()
func numberOfSections(in tableView: UITableView) -> Int {
return fetchedResultsController?.sections?.count ?? 0
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return fetchedResultsController?.sections![section].name
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchedResultsController!.sections![section].numberOfObjects
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let product = fetchedResultsController!.object(at: indexPath) as! Products
}
要正确排序部分,您必须在第一个位置指定适当的排序描述符。
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "pack.name", ascending: false),
NSSortDescriptor(key: "productId", ascending: false)]
我有 2 个实体:Products
和 Package
产品具有 name,weight,price
并且与包装的关系 pack
->对许多
包有 name
,我将它用于我的 tableView 中的部分。
产品是用 textFields 创建的,tableView 是用 [Package]
填充的。在核心数据中,我将 pack
记录为 selectedRow Package
,但是当我使用 Products
打开 tableView 时,产品位于不同的包(部分)中,而不是我在 [=13 的 tableView 中选择的=]
核心数据的结果:
"prod4"
<Packings: 0x2817a5770> (entity: Packings; id: 0xbf7e2ae6e8ae5fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p1>; data: <fault>)
"prod3"
<Packings: 0x2817b2cb0> (entity: Packings; id: 0xbf7e2ae6e8a65fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p3>; data: <fault>
"prod2"
<Packings: 0x2817b2d50> (entity: Packings; id: 0xbf7e2ae6e8a25fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p2>; data: <fault>)
"prod1"
<Packings: 0x2817a5770> (entity: Packings; id: 0xbf7e2ae6e8ae5fb1 <x-coredata://9D72FE26-796C-42CF-A3E0-1E1A3B7071AF/Packings/p1>; data: <fault>)
如您所见,prod1、prod2、prod3 应引用 pack1、pack2、pack3,在打印中描述为 p1、p2、p3。 prod4 被引用到 p1。但它们在 Products tableView 中的排列完全不同:
let fetchRequest:NSFetchRequest<Products> = Products.fetchRequest()
fetchRequest.returnsObjectsAsFaults = false
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "productId", ascending: false)]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: (UIApplication.shared.delegate as? AppDelegate)!.persistentContainer.viewContext, sectionNameKeyPath: "pack.name", cacheName: nil) as? NSFetchedResultsController<NSFetchRequestResult>
fetchedResultsController!.delegate = self
try fetchedResultsController!.performFetch()
func numberOfSections(in tableView: UITableView) -> Int {
return fetchedResultsController?.sections?.count ?? 0
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return fetchedResultsController?.sections![section].name
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fetchedResultsController!.sections![section].numberOfObjects
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let product = fetchedResultsController!.object(at: indexPath) as! Products
}
要正确排序部分,您必须在第一个位置指定适当的排序描述符。
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "pack.name", ascending: false),
NSSortDescriptor(key: "productId", ascending: false)]