2012-06-19 43 views
1

我知道如何通过NsDate对tableview中的核心数据对象进行排序,但默认情况下这似乎为每个对象都创建一个新节。我想用NSDateFormatter按照中间格式排列日期。我将如何做到这一点?核心数据按格式化日期排序tableview

例如,如果我在同一天创建了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; 

}

回答

2

(我会如果你没有,我建议检查出来写这件事假设你使用的NSFetchedResultsController来驱动你的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 

这一切都需要!我已在几个应用程序中完成此操作以获取日期分组,并且运行良好。

+0

非常感谢!我会在早上尝试这个,让你知道它是怎么回事! –

+0

有一个问题,在mediumFormattedDate中设置self.date的值是什么? –

+0

这是我得到的错误:实体InTextEntity不是关键字值“mediumFormattedDate”的编码兼容。 –

0

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

相反,你应该自己计算段索引,然后按日期排序。您可以在数据模型中完成此操作,也可以通过代码手动计算部分。例如,您可以向托管对象模型添加一个名为“Day”的属性,并将其设置为您想要使用的任何值(您不指定它是否像星期一或实际日期,如21)。

然后,您可以将该属性传递给获取的结果控制器。

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