我知道如何通过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;
}
答案 0 :(得分: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
这就是全部!我在几个应用程序中完成了这个以获得日期分组,并且运行良好。
答案 1 :(得分:0)
听起来你将获取的结果控制器上的节索引设置为你的日期属性,这似乎是不可取的。
相反,你应该自己计算部分索引,并按日期排序。您可以在数据模型中完成此操作,也可以在代码中手动计算部分。
例如,您可以向托管对象模型中添加一个名为“Day”的属性,并将其设置为您要使用的任何值(您不指定它是星期一还是实际日期,如21)。 / p>
然后,您可以将该属性传递给提取的结果控制器。
或者你可以自己实现这些部分,日子很容易,周一到周日。日期有点难度,1-28,30,31,具体取决于月份。然后使用适当的NSPredicate / NSFetchRequest获取每个部分中项目的计数。