通过格式化的日期核心数据排序的tableview(Core Data sort tableview

2019-09-18 06:51发布

我知道如何核心数据对象由一个NSDate的排序的tableview,但默认情况下,似乎为每个对象的新节。 我想通过一个媒体格式的日期与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;

}

Answer 1:

(我会写这件事假设你使用一个NSFetchedResultsController如果你没有,我建议检查出来来驱动你的tableview。)

一个有趣的特点NSFetchedResultsController的切片能力:虽然属性您排序上必须是仿照性质(因为源码进行实际排序),你组需要的部分不是财产。 唯一的要求是,分组与排序是一致的。 (即,排序由排序属性将会把对象与彼此相邻的匹配组属性。)

所以只需添加这样的事情您的建模对象类:

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

这一切都需要! 我在一些应用程序做此获取日期分组和它工作得很好。



Answer 2:

听起来你设置读取的结果控制器上的部分索引是你的日期属性,这似乎是不可取的。

相反,你或许应该自己计算的部分指标,按日期排序。 您可以在任一数据模型,或在代码中手动计算部分做到这一点。

例如,您可以将属性添加到所谓的“日”,并设置到要使用任何价值的管理对象模型(不指定如果像周一或实际日期像21)。

然后,您可以在属性传递给读取的结果控制器。

或者你可以实现自己的章节中,天易,其周一至周日。 日期是有点困难,1-28,30,31取决于它是何年何月。 然后用适当的NSPredicate / NSFetchRequest得到每个部分中的项目数。



文章来源: Core Data sort tableview by formatted date