我有一个问题,我想知道是否有可能解决。我有一个使用Core Data和NSFetchedResultsController的UITableView。我的应用程序的一个重要部分是根据日期组织事物。理想情况下,我想将TableView划分为基于3个日期范围的部分。这些范围介于现在和2天之间,2天到6天之间,以及10天甚至更长时间。用户有一个UIDatePicker,当他们输入日期时,它会自动放入其中一个有组织的部分。现在我知道如何轻松地将tableview分成每个日期的部分,但不知道怎么做,所以每个部分都有一个时间范围。感谢任何可能提供帮助的人。
答案 0 :(得分:1)
我自己就这样做了。最终结果是核心数据对象被分类为多个部分,每个部分为1天宽。多个对象可能在一个部分中。
//at a point where you define your fetched results controller
//add @"sectionTitle" as sectionNameKeyPath:
//...
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"sectionTitle" cacheName:@"CacheName"];
//....
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString* dateString = [[[self.sleepQualityController sections] objectAtIndex:section] name];
return dateString;
}
//add this to your managed object's header file:
@property(nonatomic,assign)NSString* sectionTitle;
//this goes into your managed object's implementation file
-(NSDate *)dateWithOutTime:(NSDate *)datDate
{
if( datDate == nil ) {
datDate = [NSDate date];
}
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:datDate];
return [[NSCalendar currentCalendar] dateFromComponents:comps];
}
-(NSString*)sectionTitle
{
NSDateFormatter* dateFormaterWeekdayMonthDay = [[NSDateFormatter alloc] init];
dateFormaterWeekdayMonthDay.dateStyle = NSDateFormatterLongStyle;
return [NSString stringWithFormat:@"%@", [dateFormaterWeekdayMonthDay stringFromDate:[self dateWithOutTime:self.date]] ];
}
答案 1 :(得分:0)
我会在获取请求中探索使用NSExpressions。使用类似SQL的表达式和获取请求可能很难找到好的文档;但你也可以编写自己的块来供查询使用,这是非常杀手的。
基本上你想要的是一个NSExpression,它返回一个字符串作为节名,你可以告诉NSFetchedResultsController用于节名称键路径。您需要围绕表达式构建NSExpressionDescription,以将其添加到获取请求中。
我希望这会让你朝着正确的方向前进!
FWIW,我通常倾向于做一个SQL-ish解决方案(基本上选择一个'case'表达式来比较日期字段并选择三个值之一),但有时使用Core Data,它更容易拉出来大锤(或者更确切地说,感觉就像他们希望我们做的那样)。