在 NSFetchResultsController 中派生节号

Posted

技术标签:

【中文标题】在 NSFetchResultsController 中派生节号【英文标题】:Derive section number in NSFetchResultsController 【发布时间】:2012-10-20 22:35:41 【问题描述】:

我正在使用带有 NSFetchedResultsController 的 Core Data 来显示 UITableView 中按日期部分组织的事件列表。一个日期可以有多个事件(分段中的行),如下所示:

Date 1
  Event A
  Event B
  Event C
Date 2
  Event D
Date 3
  Event E
  Event F

在特定日期可以有任意数量的事件。 我希望能够滚动到包含今天日期的部分,或者 - 如果今天没有活动 - 到最近的日期。

我创建一个 NSIndexSet 来查找对象的第一个索引,其中包含的日期晚于今天:

NSDate *dateToday = [NSDate date];
NSIndexSet *datesAfterToday = [[self.fetchedResultsController fetchedObjects] indexesOfObjectsPassingTest:
                               ^BOOL(id obj, NSUInteger idx, BOOL *stop) 
                                   Event *event = (Event *)obj;
                                   NSDate *dateToCheck = event.date;
                                   NSTimeInterval interval = [dateToday timeIntervalSinceDate:dateToCheck];
                                   if (interval <= 0) 
                                       *stop = YES;          // Only need first occurrence of date
                                       return YES;
                                   
                                   return NO;
                               ];

NSInteger index = [datesAfterToday firstIndex];

这将为我提供今天之后的第一个事件的索引。例如,如果日期 2 是第一个晚于今天的日期,那么上面的代码片段将为我提供索引 3(对于事件 D)。 但是,我希望能够滚动到第 1 节(日期 2),因此我需要节号;在这种情况下,第 1 节。

所以问题是:如果我有绝对索引号,我怎样才能得到这个节号?或者有没有其他方法可以搜索 NSFetchedResultsController 找到节号?

感谢任何帮助。 发送!

【问题讨论】:

【参考方案1】:

NSFetchedResultsController 有一个方法indexPathForObject: 来获取对象的索引路径(节和行号):

NSDate *dateToday = [NSDate date];
__block NSIndexPath *indexPath = nil;
NSArray *events = [self.fetchedResultsController fetchedObjects];
[events enumerateObjectsUsingBlock:^(Event *event, NSUInteger idx, BOOL *stop) 
    NSDate *dateToCheck = event.date;
    NSTimeInterval interval = [dateToday timeIntervalSinceDate:dateToCheck];
    if (interval <= 0) 
        indexPath = [self.fetchedResultsController indexPathForObject:event];
        *stop = YES; // Only need first occurrence of date
    
];

if (indexPath != nil) 
    // indexPath is the table view index path of the event.
    // You can use indexPath.section, indexPath.row,
    // Or perhaps this:
    [self.tableView scrollToRowAtIndexPath:indexPath ...]
 else 
    // All events are before the current date ...

注意:您的算法会找到[NSDate date] 之后的第一个事件,即当前日期和时间,而不是今天。例如,如果现在是晚上 8 点,算法会找到“今天晚上 8 点”或之后的第一个事件,这可能是明天的事件。

【讨论】:

太棒了!完美运行!非常感谢你。事实上,在“今天早上 8 点”之后的第一个事件正是我所需要的。

以上是关于在 NSFetchResultsController 中派生节号的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据