0

NSFetchedResultsControllerでCoreDataを使用して、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!

4

1 に答える 1

0

NSFetchedResultsControllerindexPathForObject:オブジェクトのインデックスパス(セクションと行番号)を取得するメソッドがあります。

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時」以降の最初のイベントを検出します。これは明日のイベントである可能性があります。

于 2012-10-21T01:24:12.740 に答える