【问题标题】:First Letter Section Headers with Core Data带有核心数据的第一个字母部分标题
【发布时间】:2011-01-27 20:50:43
【问题描述】:

我正在尝试创建一个按部分的 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 是一个瞬态属性,它返回 - 正如您所期望的 - fullName 的第一个字母。 95% 的时间,这都能完美运行。

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

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

【问题讨论】:

    标签: iphone-sdk-3.0 core-data


    【解决方案1】:

    我没有过多地使用部分索引,但一个想法是将firstLetter 排序添加为NSFetchRequest 的第一个排序,并将fullName 排序添加为第二个排序。

    如果这不起作用,如果您可以发布一个包含错误的示例项目以便我们可以使用它,那就太好了。如果结果是 Apple 错误,则可以使用相同的示例项目来提交雷达。如果不是这样,当他们不必创建相同的项目并尝试重新发现错误时,您更有可能让某人帮助解决它。

    另外,在示例项目中,您总是有机会偶然发现答案。经常发生在我身上:)

    更新

    我更喜欢 Gerry3 的回答。

    【讨论】:

    • 谢谢,我会尝试创建一个项目来做到这一点。问题是这个问题非常罕见,但每隔一段时间我就会看到它,并且我会收到几封来自客户的电子邮件,说他们的整个列表都是空白的——这是由这个问题引起的。很难以足够可靠的方式进行复制以直接进行调试,但一旦发生,就会成为一个严重的问题。
    【解决方案2】:

    我对“首字母列表”的意思感到困惑。

    您不应该创建这样的列表。您只需为瞬态“firstLetter”属性实现 getter,并使用获取的结果控制器的样板方法来实现表视图方法。

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

    【讨论】:

    • 感谢您的回复。我实际上并没有创建一个列表,核心数据是在内部创建一个列表。您给我的链接正是我所做的一切,使用瞬态属性来提供对象的第一个字母。 Core Data 在内部维护 2 个列表,主排序列表和用于计算哪些对象属于哪个部分的部分列表。这两个列表必须排序相同,如果不是,我们就会遇到问题 - 就像我遇到的那样。
    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多