iphone-sdk-3.0 - 带有核心数据的首字母部分标题

标签 iphone-sdk-3.0 core-data

我正在尝试创建一个按部分的 TableView 排序的人员列表,其中第一个字母作为每个部分的标题 - 就像地址簿一样。我已经一切正常,尽管排序顺序有点问题。这是我现在的做法:

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 是一个 transient 属性,如您所料,它返回 fullName 的第一个字母。 95% 的情况下,这都是完美的。

问题是结果 Controller 期望这两个“列表”(排序后的 fullName 列表和排序后的firstLetter 列表)完全匹配。如果我有两个像约翰和 jack 这样的联系人,我的全名列表每次都会将它们排序为 jack ,约翰,但我的第一个字母列表有时可能会将它们排序为约翰, jack ,因为它只按第一个字母排序,其余的都由运气决定。当这些列表不匹配时,我会得到一个空白的 tableView,其中包含 0 个项目。

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

最佳答案

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

您不应该创建这样的列表。您只需实现 transient “firstLetter”属性的 getter,并使用获取结果 Controller 的样板方法来实现 TableView 方法。

参见this answerHow to use the first character as a section name了解详情。

关于iphone-sdk-3.0 - 带有核心数据的首字母部分标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2450399/

相关文章:

iphone - 横向模式下的 UIScrollView 框架大小问题

iPhone-UIToolbar自动定位

ios - 如何查询核心数据中按唯一值分组的值?

iphone - 有没有办法使用 iPhone SDK 将 iPod 音乐文件保存到 iPhone 应用程序?

objective-c - 无法追踪的奇怪 GDB 错误

ios - 由CONTAINS谓词引起的异常

ios - 基于关系的两个属性来获取的核心数据谓词

swift - 编辑核心数据列表项追加而不是添加

iphone - MPMediaItems 原始歌曲数据

ios - 快速传递参数?