【问题标题】:Apparently wrong section index title after NSFetchedResultsController performFetch:NSFetchedResultsController performFetch 之后显然错误的部分索引标题:
【发布时间】:2015-02-18 08:47:04
【问题描述】:

我目前面临一个(对我而言)奇怪的问题,如下所示:

我有一个孩子 MOC (NSManagedObjectContext),有大约两打 MO (NSManagedObjects)。每个 MO 都有一个可选的布尔属性 flag。所有这些都设置为@(NO)fetchedResultsController 是一个NSFetchedResultsController,它获取这些MO,其managedObjectContextmoc,其sectionNameKeyPath@"flag"fetchedResultsControllerflag 上也有一个sort descriptor(以及另一个二级排序属性)。

运行这几行代码后

NSAssert(!moc.hasChanges, nil); // no unsaved changes
BOOL flag = [fetchedResultsController performFetch: &error];
NSAssert(flag && (error == nil), nil); // no errors

我观察到以下几点:

  1. fetchedResultsController.fetchedResults 包含与 moc 一样多的 MO,并且它们的所有标志都是 @(NO)(正如人们所期望的那样)。
  2. fetchedResultsController.sections.countfetchedResultsController.sectionIndexTitles.count 都是 1(正如人们所预料的那样,因为所有 flags 都具有相同的值)。
  3. fetchedResultsController.sectionIndexTitles[0]@"1"

第三项对我来说似乎是错误的。我会期待@"0"(因为这是[@(NO) description]capitalized first letter)。

这里可能有什么问题,在这种情况下如何获得正确的部分索引标题?

更新我现在看起来问题可能与使用flag(可选的布尔核心数据属性)作为sectionNameKeyPath有关(still)。即使flag 的值不同,performFetch: 也只会导致一个标题为@"1" 的部分。

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller


    【解决方案1】:

    我认为依靠description实现部分标题字段是不可靠的。这可能适用于字符串,但这是数值的预期解决方案似乎违反直觉。无论如何,您可能不希望在最终实现中使用这些值。

    你应该实现sectionIndexTitleForSectionName,检查那里的布尔值并返回一个正确的字符串。请注意,此方法已经接收到一个字符串,因此您需要检查它是否正确。我怀疑不是,您必须确保 NSNumber 生成正确的字符串。也许您需要向NSNumber 添加一个方法作为类别,以返回布尔值的正确字符串。您的sectionNameKeyPath 将类似于“flag.toString”或类似的东西。

    您可能要检查的另一件事:根据您设置托管对象子类和模型的方式,您可能忘记取消引用 NSNumber 的值。

    BOOL falseValue = @(NO).boolValue; // NO
    

    但是

    BOOL falseValue = @(NO);           // YES
    

    【讨论】:

    • 我认为你几乎是对的:实现sectionIndexTitleForSectionName 并没有帮助,因为它已经收到了派生的NSString,不再是布尔值。我确实错误地假设推导是用description 完成的。解决这个问题的方法是在NSString 上定义一个类别,方法是toString 用于从NSNumbers 派生NSStrings,并使用sectionNameKeyPathset 控制派生flag.toString。你想相应地更新你的答案吗?如果是这样,我会接受,因为当前版本让我走上了正轨。
    • 好的,我更新了我的答案。在我看来,您需要在 NSNumber 上的类别,而不是在 NSString 上。
    • 是的,NSNumber(错字)。
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多