6

現在、日付オブジェクトを含むクラスがあります。この日付オブジェクトには、時間と日の両方が含まれています。この情報はすべて、UITableViewCell経由でにロードされNSFetchedResultsControllerます。日付をセクションに並べ替える必要があります。各セクションは時間のない日付です。また、各セクションを時間順にソートする必要があります。現在の _fetchedResultsController は次のようになります。

[self.managedObjectContext lock];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Entity" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"due" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                               cacheName:@"Root"];
theFetchedResultsController.delegate = sender;
[self.managedObjectContext unlock];
return theFetchedResultsController;

ソートする必要がある属性はEntity.due属性です。

4

1 に答える 1

9

詳細については、「DateSectionTitles」というコア データ サンプルを参照してください。ここでは、基本的な部分を強調しています。

日付に従ってセクションを作成するには、最初に正規化された (または簡略化された) 日付で並べ替える必要があります。次のことを試してください。

コア データ モデル エディターでエンティティに一時属性を追加します。そのタイプが NSDate であり、その一時的なプロパティがチェックされていることを確認してください。プロパティを強力な NSDate として追加して、NSManagedObject クラス ファイルを更新します。それを「simplifiedDate」と呼びます。また、別のプロパティを .h ファイルに追加して、「primitiveSimplifiedDate」と呼びます。強いものにします。

.m では、simplifiedDate とprimitiveSimplifiedDate の両方に @dynamic を使用します。この一時的な属性は、深夜に正規化された NSDate を返す必要があります。このレベルではすべてが設定され、セクションを確立できます。私はこれに沿ってコードを使用しました:

-(NSDate *)simplifiedDate{
     // Create and cache the section identifier on demand.

    [self willAccessValueForKey:@"simplifiedDate"];
    NSDate *tmp = [self primitiveSimplifiedDate];
    [self didAccessValueForKey:@"simplifiedDate"];

    if (!tmp) {
        tmp=[self simplifiedDateForDate: [self due]];
        [self setPrimitiveSimplifiedDate: tmp];
    }

    return tmp;
}


-(NSDate *)simplifiedDateForDate:(NSDate *)date {

    if (!date) {
        return nil;
    }

    static NSCalendar *gregorian = nil;

    gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *newDateComponents=[gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit| NSDayCalendarUnit) fromDate:date];

    return [gregorian dateFromComponents:newDateComponents];
 }

必要に応じて、これは、実際の日付が設定されたときに計算および格納される実際の属性にすることもできます。

次に、2 つのソート記述子があります。最初のソート記述子は、上記の一時属性「simplifiedDate」になります。2 番目の属性は「due」属性です。「simplifiedDate」は、次のステップで NSFetchedResultsController が正しく設定されている限り、セクションに従ってすべてを並べ替えます。

最後に、NSFetchedResultsController を割り当て/初期化するときに、セクション キー名を指定する必要があります。この場合は「simplifiedDate」になります。このような:

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"simplifiedDate"cacheName:@"Root"];

お役に立てれば。

t

于 2012-07-11T05:47:21.233 に答える