在NSFetchedResultsController中导出节号

时间:2012-10-20 22:35:41

标签: uitableview date core-data nsfetchedresultscontroller

我正在使用Core Data和NSFetchedResultsController来显示由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以查找节号?

感谢任何帮助。 TX!

1 个答案:

答案 0 :(得分:0)

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点”或之后找到第一个事件,这可能是明天的事件。