【发布时间】:2011-03-20 08:16:49
【问题描述】:
我目前正在开发一个具有几个实体和关系的应用程序,如下所示:
项目 类别。
我目前正在获取 Item 实例并使用该项目的 category.name 在部分中显示它们。在这种情况下,我可以使用排序描述符按名称对类别进行排序,这非常简单并且工作正常(下面的相关代码):
-(NSFetchedResultsController*)fetchedResultsController {
if (fetchedResultsController_ != nil)
return fetchedResultsController_;
NSManagedObjectContext *moc = [order_ managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"category.name"
cacheName:nil];
controller.delegate = self;
self.fetchedResultsController = controller;
[controller release];
[fetchRequest release];
NSError *error = nil;
if (![fetchedResultsController_ performFetch:&error]) {
// Error handling
}
return fetchedResultsController_;
}
我现在的问题是我需要对这些类别进行排序,而不是按名称,而是按 Category 实体的(NSNumber*) displayOrder 属性。 但是我需要 tableview 上的部分标题才能继续使用该类别的 name。
如果我将 sortDescriptor 设置为使用 category.displayOrder 并将 sectionNameKeyPath 保持为 category.name,则部分标题可以正常工作,但 sortDescriptor 会被 fetchedResultsController 忽略,并且表格部分按类别名称排序(不知道为什么??)。
我的下一个想法是覆盖displayOrder getter 方法,但这并没有让我走得太远,因为返回类型不同,而且我需要实际的 displayOrder 值来进行部分排序。
所以现在我有一个感觉有点笨拙的解决方案(下面的代码),我想知道是否有更好的方法来单独使用 fetchedResultsController 来实现同样的事情。
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
// The code below grabs a reference to first object for a given section
// and uses it to return the associated category name
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
NSArray *menuItems = [sectionInfo objects];
if ([menuItems count] > 0)
{
MenuItem *menuItem = [menuItems objectAtIndex:0];
NSString *categoryName = menuItem.category.name;
return categoryName;
}
return [sectionInfo name];
}
我在这里缺少一些基本的东西吗?
提前感谢您的想法。
罗格
【问题讨论】:
-
您看过 Apple 的 The Elements 示例项目吗?我记得,它处理所有这些东西。
标签: objective-c ios core-data nsfetchedresultscontroller