我遇到了NSFetchedResultsController's
方法的问题。我已经阅读了实现,但它似乎没有点击。具体来说,这些方法(来自Apple文档):
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[<#Fetched results controller#> sections] count];
}
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[<#Fetched results controller#> sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[<#Fetched results controller#> sections] objectAtIndex:section];
return [sectionInfo name];
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return [<#Fetched results controller#> sectionIndexTitles];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return [<#Fetched results controller#> sectionForSectionIndexTitle:title atIndex:index];
}
我不理解的是sections
和sectionIndexTitles
属性。我在初始化NSFetchedResultsController
时从未声明过这些属性,那么XCode如何知道它们以及如何在不崩溃的情况下显示它们?
此外,在方法
中NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@"<#Cache name#>"];
我不明白如何设置sectionNameKeyPath
。例如,如果我想创建一个包含已完成和未完成任务的待办事项列表,我将如何将它们区分为两个部分?我是否需要任务实体中的值?并且这个值必须是一个字符串/我必须给它一个自定义的setter吗?
我真的很感激帮助!
答案 0 :(得分:1)
1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
这是您要在表格中显示的部分。部分是一组具有共同点的项目。他们可能都以相同的字母开头(如在“联系人”应用中),他们可能是属于不同联盟的团队,他们可能是由他们出生在哪个国家/地区划分的人员等等。
2
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section;
这是属于提供的部分的项目数。例如,可能有3个人在法国出生,2个出生在德国。所以你去找你的结果控制器询问那个部分有多少个对象并返回数字。
3
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
这是该部分的标题。 “法国”,“德国”等...
如果在获取的结果控制器中指定了“sectionKeyPath”,则section.name将是您为其提供的路径名的数据对象的分组值。
即。 sectionKeyPath = countryOfBirth.name;
这将返回该部分中每个人的出生对象国家的名称值。
4
和
5
这些都与表格右下角的索引相关。它们是可选的。我建议暂时忽略这些,直到你了解其他方法。
所以,使用我的例子你可能会做这样的事情......
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestForEntityName:@"Person"];
NSSortDescriptor *countrySD = [NSSortDescriptor sortDescriptorWithKey:@"countryOfBirth.name" ascending:YES];
NSSortDescriptor *nameSD = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
[fetchRequest setSortDescriptors:@[countrySD, nameSD]];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:@"countryOfBirth.name"
cacheName:nil];
这会让你得到像......
- Albania
- Bob
- Margaret
- France
- Alice
- John
- Zimbabwe
- Jason
- Zachary