具有核心数据的第一个字母部分标题

时间:2010-03-15 20:53:20

标签: iphone-sdk-3.0 core-data

我正在尝试创建一个按表格查看的人员列表,其中第一个字母作为每个部分的标题 - 一个地址簿。尽管排序顺序存在一些问题,但我已经完成了所有工作。这是我现在正在做的方式:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Contact" inManagedObjectContext:context]];

NSSortDescriptor *fullName = [[NSSortDescriptor alloc] initWithKey:@"fullName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:fullName, nil];
[request setSortDescriptors:sortDescriptors];
[fullName release];
[sortDescriptors release];

NSError *error = nil;
[resultController release];
resultController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:@"firstLetter" cacheName:nil];
[resultController performFetch:&error];
[request release];

fullName是一个标准属性,firstLetter是一个瞬态属性,它返回 - 正如您所期望的 - fullName的第一个字母。 95%的时间,这完美地运作。

问题是结果控制器期望这两个“列表”(排序的fullName列表和排序的firstLetter列表)完全匹配。如果我有像John和Jack这样的2个联系人,我的fullName列表会将这些列为Jack,John每次排序,但我的第一个Letter列表可能会将它们排序为John,Jack有时因为它只是按第一个字母排序而剩下的就是机会。当这些列表不匹配时,我得到一个空白的tableView,其中包含0个项目。

我不确定如何解决这个问题,但这非常令人沮丧。有没有其他人遇到这个?你们发现了什么?

2 个答案:

答案 0 :(得分:3)

我对“第一个字母列表”的含义感到困惑。

您不应该创建这样的列表。您只为瞬态“firstLetter”属性实现getter,并使用fetched results controller的样板方法来实现表视图方法。

有关详情,请参阅this answerHow to use the first character as a section name

答案 1 :(得分:0)

我没有过多地使用部分索引,但有人认为将firstLetter排序添加为NSFetchRequest的第一种排序,并添加fullName排序作为第二种分类。

如果这不起作用,那么如果您可以发布带有错误的示例项目以便我们可以使用它将会很棒。如果结果是Apple漏洞,可以使用相同的示例项目来提交雷达。如果它不是你更有可能找人帮助解决它,而不必创建相同的项目并尝试重新发现错误。

另外,在示例项目中总是有机会绊倒答案。一直发生在我身上:))

更新

我更喜欢Gerry3的答案。