1

NsDate によって tableview 内の Core Data オブジェクトを並べ替える方法を知っていますが、これはデフォルトで各オブジェクトの新しいセクションを作成するようです。NSDateFormatter を使用して、中形式の日付で並べ替えたいと思います。どうすればいいですか?

たとえば、同じ日に作成された 3 つのオブジェクトがある場合、それらを同じセクションに配置し、セクション タイトルがその日であるようにします。時間は必要ありません。

各オブジェクトには NSDate プロパティがあります。ご協力いただきありがとうございます。

これは、rgeorge の提案を含む fetchedResultsController にあるコードです。ここで何が欠けていますか?

- (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController != nil) {
    NSLog(@"get old fetched controller");

    return fetchedResultsController;
}

else{
    NSLog(@"get new fetched controller");
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"InTextEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];

NSSortDescriptor *dateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dateModified" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:dateDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];


NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"mediumFormattedDate" cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

NSError *error = nil;
if (![fetchedResultsController performFetch:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

}

return fetchedResultsController;

}

4

2 に答える 2

2

(テーブルビューを駆動するために を使用していると仮定して、これを書きますNSFetchedResultsController。そうでない場合は、確認することをお勧めします。)

のセクション化機能の興味深い機能NSFetchedResultsController: ソートするプロパティはモデル化されたプロパティである必要がありますが (sqlite が実際のソートを行うため)、セクションをグループ化するプロパティはそうである必要はありません。唯一の要件は、グループ化が順序と一致していることです。(つまり、sort プロパティでソートすると、グループ プロパティが一致するオブジェクトが隣り合わせに配置されます。)

したがって、モデル化されたオブジェクト クラスに次のようなものを追加するだけです。

// in interface
@property (nonatomic, readonly) NSString *mediumFormattedDate;

// in impl
-(NSString *)mediumFormattedDate
{
  // this can be fancier if you need a custom format or particular timezone: 
  return [NSDateFormatter localizedStringFromDate:self.date
                                        dateStyle:NSDateFormatterMediumStyle
                                        timeStyle:NSDateFormatterNoStyle];
}

(.xcdatamodel で mediumFormattedDate について言及する必要はまったくありません。)

次に、日付プロパティでオブジェクトを並べ替えますが、新しいプロパティでグループ化します。を作成するときはNSFetchedResultsController、次の行に沿って作成します。

NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"MyFancyEntity"];
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"date"
                                                     ascending:YES];
[fr setSortDescriptors:[NSArray arrayWithObject:sd]];
NSFetchedResultsController *frc =
[[NSFetchedResultsController alloc] initWithFetchRequest:fr
                                    managedObjectContext:myManagedObjectContext
                                      sectionNameKeyPath:@"mediumFormattedDate"
                                               cacheName:nil];
// then do stuff with frc

それだけです!日付のグループ化を取得するためにいくつかのアプリでこれを実行しましたが、うまく機能します。

于 2012-06-20T02:31:36.107 に答える
0

フェッチされた結果コントローラーのセクション インデックスを日付プロパティに設定しているように聞こえますが、これは望ましくないようです。

代わりに、セクション インデックスを自分で計算し、日付で並べ替える必要があります。これは、データ モデルで行うか、コードでセクションを手動で計算することによって行うことができます。

たとえば、管理オブジェクト モデルに "Day" というプロパティを追加し、それを任意の値に設定できます (月曜日のようなものか、21 のような実際の日付かは指定しません)。

次に、そのプロパティをフェッチされた結果コントローラーに渡すことができます。

または、セクションを自分で実装することもできます。月曜から日曜までは簡単です。日付は少し難しく、月に応じて 1 ~ 28、30、31 になります。次に、適切な NSPredicate / NSFetchRequest を使用して、各セクションのアイテム数を取得します。

于 2012-06-19T18:26:34.157 に答える