1

我知道如何通过 NsDate 在 tableview 中对 Core Data 对象进行排序,但默认情况下这似乎为每个对象创建了一个新部分。我想用 NSDateFormatter 按中等格式的日期对它们进行排序。我该怎么做?

例如,如果我在同一天创建了 3 个对象,我希望它们位于同一节中,节标题为当天,不需要时间。

每个对象都有一个 NSDate 属性。谢谢你的帮助。

这是我在 fetchedResultsController 中的代码以及 rgeorge 的建议。我在这里想念什么?

- (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

(假设您使用 anNSFetchedResultsController来驱动您的 tableview,我会写下来。如果不是,我建议您检查一下。)

的分区功能的一个有趣特性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 这样的实际日期)。

然后,您可以将该属性传递给 fetched results 控制器。

或者,您可以自己实施这些部分,日子很容易,周一至周日。日期有点难,1-28,30,31 取决于月份。然后使用适当的 NSPredicate / NSFetchRequest 来获取每个部分中项目的计数。

于 2012-06-19T18:26:34.157 回答