一个NSFetchedResultsController,日期为sectionNameKeyPath

Pau*_*tin 22 sorting iphone core-data nsfetchedresultscontroller

我开发了一个使用Core Data的应用程序.在一个UITableView中,我想显示我的实体列表,按照对象的保存日期排序.当我这样做:

fetchedResultsController = [[NSFetchedResultsController alloc]
                            initWithFetchRequest:fetchRequest
                            managedObjectContext:managedObjectContext
                              sectionNameKeyPath:@"date"
                                       cacheName:nil];
Run Code Online (Sandbox Code Playgroud)

我为每个对象添加了一个新部分,因为此代码也根据秒数对日期进行分组.但我想要一个按日期分组的对象列表,但只根据日,月和年.有可能吗?怎么样?

非常感谢您的帮助!!;)

Rog*_*Rog 41

这应该是你的诀窍:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
  NSString *rawDateStr = [[[self.fetchedResultsController sections] objectAtIndex:section] name];
  // Convert rawDateStr string to NSDate...
  NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
  [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"];
  NSDate *date = [formatter dateFromString:rawDateStr];

  // Convert NSDate to format we want...
  [formatter setDateFormat:@"d MMMM yyyy"];
  NSString *formattedDateStr = [formatter stringFromDate:date];
  return formattedDateStr;  
}
Run Code Online (Sandbox Code Playgroud)

[编辑]

Jus看到了你的评论以及你想要实现的目标,你可以创建一个瞬态NSDate属性(非持久性),其格式与上面的代码类似(即没有H:mm:ss ZZZZ)并使用该属性作为你的sectionNameKeyPath值.

因此,在一个简而言之foo对象,具有fooDatefooDateTransient属性,你会:

  1. 获取您的foo.fooDate属性

  2. 使用上面的代码(或类似代码)对其进行转换,并将NSDate结果分配给foo.fooDateTransient

  3. 使用fooDateTransient为您sectionNameKeyPath创建时fetchedResultsController的对象.

PS:我自己没有测试过,但值得一试!

祝你好运,罗格

  • 我们能得到更新吗?我在同一点qPaul是他的第一个评论(即EACH对象的一个​​标题.)我有点理解这里的技术与transient属性,但我很困惑在哪里执行项目#1,和#2?我有一个构造并返回正确的NSFetchedResultsController的方法.在这个方法里面我需要为sectionNameKeyPath设置第3项.我在哪些方法中做项目#1和#2?在viewDidLoad中获取我的FetchedResults后,我循环遍历所有结果并显式设置瞬态Date属性? (2认同)
  • 不幸的是,瞬态属性不能在sectionNameKeyPath或SortDecrooptors中使用 (2认同)