我正在努力了解Core Data(我在iPhone开发中是一个菜鸟)并且为了做到这一点,我试图从fetchedresultscontroller获取一个对象和它的名字是NSlog(对象的一个属性) )。我试着这样做:
NSArray *ar = [NSArray arrayWithArray:[fetchedResultsController sections]];
Task *t = [ar objectAtIndex:0];
NSLog(@"%@", t.taskName);
但是,该应用程序因此错误而崩溃:应用程序因错误而崩溃
因未捕获而终止应用 例外 'NSInvalidArgumentException',原因: '*** - [_ NSDefaultSectionInfo taskName]:发送无法识别的选择器 例如0x3d1f670'
我已经知道你需要为此使用fetched objects属性,但那么部分是什么?感谢您的帮助,对不起,如果这是一个极其愚蠢的问题。我查看了文档,但仍然不明白。
答案 0 :(得分:27)
NSFetchedResultsController
可以根据您指定的键将对象分组。因此,例如,如果您的实体具有category
属性,则可以按category
对对象进行分组,并将其显示在该类别的标题下。
每个UITableView
(以及每个NSFetchedResultsController
)至少包含一个部分,因此即使您没有使用此功能,您仍然需要处理部分。如果您check the documentation,您将看到sections
属性中的对象符合NSFetchedResultsSectionInfo
协议,该协议具有包含该部分中对象的objects
属性。
有两种方法可以从NSFetchedResultsController
中获取实际对象:
id <NSFetchedResultsSectionInfo> sectionInfo = [fetchedResultsController.sections objectAtIndex:0];
Task *task = [sectionInfo.objects objectAtIndex:0];
另一种更简单,更首选的方法是使用objectAtIndexPath:
方法。
Task *task = [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
这两个样本是等价的。 UIKit adds some methods to NSIndexPath
可以更轻松地处理表视图和获取结果控制器。另请注意,UITableViewDataSource
和UITableViewDelegate
方法都为您提供了NSIndexPath
个对象,因此您通常可以将这些对象传递给objectAtIndexPath:
以获取该单元格的正确对象。
Apple还在iPhone上使用Core Data提供decent tutorial。它会回答你的很多问题。不幸的是,它没有涵盖NSFetchedResultsController
的深度。