我目前面临一个(对我而言)奇怪的问题如下:
我有一个孩子MOC(NSManagedObjectContext
),有大约二十个MO(NSManagedObject
s)。每个MO都有一个可选的布尔属性flag
。所有这些都设置为@(NO)
。 fetchedResultsController
是一个NSFetchedResultsController
,用于提取这些MO,其managedObjectContext
为moc
且其sectionNameKeyPath
为@"flag"
。 fetchedResultsController
flag
上还有一个sort descriptor(以及另一个辅助排序属性)。
运行这些代码后
NSAssert(!moc.hasChanges, nil); // no unsaved changes
BOOL flag = [fetchedResultsController performFetch: &error];
NSAssert(flag && (error == nil), nil); // no errors
我观察到以下内容:
fetchedResultsController.fetchedResults
包含与moc
一样多的MO,并且所有标志都是@(NO)
(正如人们所期望的那样)。fetchedResultsController.sections.count
和fetchedResultsController.sectionIndexTitles.count
都是1
(正如人们所期望的那样,因为所有flag
都具有相同的值。)fetchedResultsController.sectionIndexTitles[0]
是@"1"
。第三项似乎对我不对。我原以为@"0"
(因为这是[@(NO) description]
的{{3}})。
这里可能出现什么问题,如何在这种情况下获得正确的部分索引标题?
更新我现在看起来好像问题(capitalized first letter)与使用flag
(可选的布尔核心数据属性)相关sectionNameKeyPath
。即使flag
的值不同,performFetch:
也会导致只有一个标题为@"1"
的部分。
答案 0 :(得分:1)
我认为依靠节标题字段的description
实现是不可靠的。这可能适用于字符串,但这似乎是违反直觉的,这是数值的预期解决方案。无论如何,您可能不希望在最终实现中使用这些值。
你应该实现sectionIndexTitleForSectionName
,检查那里的布尔值并返回一个正确的字符串。请注意,此方法已接收字符串,因此您需要检查它是否正确。我怀疑它不是,你必须确保NSNumber生成正确的字符串。也许您需要将一个方法添加到NSNumber
作为类别,以返回布尔值的正确字符串。您的sectionNameKeyPath
将类似于“flag.toString”或类似内容。
您可能想要检查的另一件事:根据您设置托管对象子类和模型的方式,您可能忘记取消引用NSNumber
的值。
BOOL falseValue = @(NO).boolValue; // NO
但
BOOL falseValue = @(NO); // YES