【问题标题】:How To Implement Sections with NSFetchedResultsController如何使用 NSFetchedResultsController 实现部分
【发布时间】:2013-10-21 16:15:37
【问题描述】:

我已经阅读了多个类似的问题和网站,但对此我无法理解。

我有一个 NSFetchedResultsController,它显示来自用户的信息,将信息添加到带有文本字段的 ModalViewController 中。用户看到一个 ModalView,他们在字段中输入一些单词,单击保存,这构成了 TableView 中的单个分段行,它实现了 NSFetchedResultsController 协议。

我现在想做的是:

  • 在其中一个文本字段中,能够根据该文本字段中提供的信息创建一个新部分。

我的 fetchrequest 是:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController; 

我要展示的属性是occasion.date,意思是Transaction实体到Occasion实体(occasion)的关系,createdDate是Occasion实体上的一个属性。

我可以看到 sectionNameKeyPath:nil 需要更新,但我要更新它到什么,我还必须更改任何数据源方法、标题等吗?

对此的任何帮助将不胜感激。

谢谢,

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller nsfetchrequest sections


    【解决方案1】:

    确切的答案取决于应显示为节标题的内容以及如何显示 部分应该排序。

    但一般情况下,您必须为实体添加一个属性,然后将其用作sectionNameKeyPath 参数。此外,您必须添加一个第一个排序描述符 使用相同的键(这个条件可以稍微放宽)。

    例如,如果您只是将字符串属性sectionName 添加到实体并使用 作为sectionNameKeyPath 和第一个排序描述符键,然后是所有对象 sectionName 的相同值将被分组为一个部分, 并且这些部分将按sectionName 排序。 其余 排序描述符用于对每个部分中的对象进行排序。

    另一个例子是用字符串属性定义一个单独的实体“Section” “title”和一个整数属性“index”,添加一个一对一的关系“section”来自 “事务”到“部分”,并将section.index 用作sectionNameKeyPath。 同样,具有相同部分的所有对象都被分组在一起,但这些部分是 现在按section.index的值排序,可以修改 tableView:titleForHeaderInSection: 以便 title 显示在该部分中 标头而不是 索引

    这是很笼统的,但我希望它能让你开始。

    【讨论】:

    • 感谢您的帮助 Martin - 这确实有道理,只是实现有点困难.. 作为试验,我已将我的 name 属性设置为 sectionNameKeyPath.. 所以这就是 @"whoBy .name" 其中 whoBy 是从事务到调用名称属性的人员实体的关系。然后我将以下内容作为 titleForHeaderInSection:- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return [ [[self.fetchedResultsController section] objectAtIndex:section] name]; } 我只得到一个部分,一行.. 你有什么想法吗?
    • sectionNamekeyPath 是否应该是: sectionNameKeyPath:@"whoBy.name" ,这是我的 fetchRequest 中的第一个(也是唯一一个)sortDescriptor .. 我觉得我快到了,而且快到了.. 但是只需要一点指导 - 谢谢!
    • @amitsbajaj:将 sectionNameKeyPath 和第一个排序描述符设置为 @"whoBy.name" 所有具有相同值的 "whoBy.name" 事务应分组到同一部分。如果有不同的名称,那么您应该有多个部分。也许检查 numberOfSections 和 numberOfRowsInSection 是否正确实现。
    • 感谢您的及时回复 - 有趣的是,numberOfSections 完全丢失了!当我把它放进去时,它现在运行顺利:) 我现在会调整它以反映用户选择的日期,这会好得多,但是你帮助我完成这一步已经取得了巨大的进步!再次感谢马丁 :)
    • 实际上 - 只是快速问你......我作为部分标题放置的属性与第一个 sortDescriptor 无关 - 然后我需要对此做任何特别的事情吗?跨度>
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多