iOS - 基于日期范围的UITableView部分

时间:2012-06-15 15:28:33

标签: ios uitableview nsdate range sections

我有一个问题,我想知道是否有可能解决。我有一个使用Core Data和NSFetchedResultsController的UITableView。我的应用程序的一个重要部分是根据日期组织事物。理想情况下,我想将TableView划分为基于3个日期范围的部分。这些范围介于现在和2天之间,2天到6天之间,以及10天甚至更长时间。用户有一个UIDatePicker,当他们输入日期时,它会自动放入其中一个有组织的部分。现在我知道如何轻松地将tableview分成每个日期的部分,但不知道怎么做,所以每个部分都有一个时间范围。感谢任何可能提供帮助的人。

2 个答案:

答案 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,它更容易拉出来大锤(或者更确切地说,感觉就像他们希望我们做的那样)。