我正在使用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!
答案 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点”或之后找到第一个事件,这可能是明天的事件。