Uitableview 核心数据按格式化日期排序表视图

Uitableview 核心数据按格式化日期排序表视图,uitableview,core-data,ios5,nsdate,nsdateformatter,Uitableview,Core Data,Ios5,Nsdate,Nsdateformatter,我知道如何按NsDate对tableview中的核心数据对象进行排序,但这在默认情况下似乎会为每个对象创建一个新的部分。我想用NSDateFormatter按中等格式的日期对它们进行排序。我该怎么做 例如,如果我在同一天创建了3个对象,我希望它们位于同一节中,节标题为当天,不需要时间 每个对象都有一个NSDate属性。谢谢你的帮助 这是我在fetchedResultsController中的代码,其中包含了rgeorge的建议。我错过了什么 - (NSFetchedResultsControll

我知道如何按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;

}

听起来像是在将“获取结果”控制器上的节索引设置为日期属性,这似乎是不可取的

相反,您可能应该自己计算节索引,并按日期排序。您可以在数据模型中或通过在代码中手动计算部分来实现这一点

例如,您可以向托管对象模型中添加一个名为“Day”的属性,并将其设置为您想要使用的任何值(您不需要指定它是星期一还是实际日期,如21)

然后可以将该属性传递给“获取结果”控制器

或者,您可以自己实现这些部分,日子很简单,现在是星期一星期天。日期有点难,1-28,30,31取决于月份。然后使用适当的NSPredicate/NSFetchRequest获取每个部分中的项目计数。

(假设您使用的是
NSFetchedResultsController
来驱动您的tableview,我会写这篇文章。如果您没有,我建议您签出它。)

NSFetchedResultsController
的分区功能有一个有趣的特性:尽管排序所依据的属性必须是一个建模属性(因为sqlite进行实际排序),但分区分组所依据的属性不必是。唯一的要求是分组与排序一致。(即,按排序属性排序将使具有匹配组属性的对象彼此相邻。)

因此,只需在建模对象类中添加如下内容:

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

就这些!我已经在一些应用程序中完成了这项工作,以获得日期分组,效果很好。

非常感谢!我会在早上试试这个,让你知道它是怎么回事!有一个问题,在mediumFormattedDate中设置self.date的值是什么?这是我得到的错误:实体InTextEntity不符合键“mediumFormattedDate”的键值编码。听起来你的InTextEntity实例可能不是你添加mediumFormattedDate:到的任何类的实例?检查您的xcdatamodel。我应该提到,这种技术需要自定义实体类——使用普通的NSManagedObjects是行不通的。如果没有更多的细节,我就说不出更多了。至于“self.date”:“self”是托管对象,“date”是对排序依据的日期属性名称的猜测。替换为您使用的实际名称。