Core Data 一对多关系:在 UITableView 中将所有相关对象列为节标题
Posted
技术标签:
【中文标题】Core Data 一对多关系:在 UITableView 中将所有相关对象列为节标题【英文标题】:Core Data 1-to-many relationship: List all related objects as section header in UITableView 【发布时间】:2010-02-25 19:58:23 【问题描述】:我在 iPhone 上使用 Core Data 时遇到以下问题: 我在 Core Data 中有一对多的关系。假设实体被称为配方和类别。一个类别可以有许多食谱。 我完成了在 UITableView 中列出的所有食谱,其中部分标题以类别命名。 我想要实现的是将所有类别列为部分标题,即使是那些没有配方的类别:
category1 <--- this one should be displayed too
category2
recipe_x
recipe_y
category3
recipe_z
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:10];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"category.categoryName" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"recipeName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"category.categoryName" cacheName:@"Recipes"];
使用核心数据实现这一目标的最优雅方法是什么?
【问题讨论】:
【参考方案1】:如果其中没有行,则实际上并不意味着要显示部分。这就是UITableView
的设计方式。如果您真的想要强制它,您需要在-numberOfRowsForSection:
的数据源调用中添加逻辑,使其看起来总是有一行,然后您可以使用-heightForRowAtIndexPath:
来尝试并隐藏该行。
话虽如此,这是一个可怕的想法。让这些部分像设计的那样隐藏起来。
【讨论】:
UI 约定的存在是为了使应用程序之间的界面行为保持一致。覆盖它会使您的应用程序的行为与其他应用程序不同,并可能导致对所呈现数据的混淆。我也会避免修改部分行为。【参考方案2】:你不能用 sectionNameKeyPath 代码干净地做到这一点。我会修改获取请求查询类别,并告诉它包含子实体:
[fetchRequest setIncludesSubentities:YES];
这样查询会很高效,不会到处出错。从那里充实你的代表应该很简单。
【讨论】:
以上是关于Core Data 一对多关系:在 UITableView 中将所有相关对象列为节标题的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift Core Data 中从一对多关系中获取对象