【发布时间】:2014-02-17 19:39:09
【问题描述】:
我正在为 iOS 创建一个待办事项列表应用程序。待办事项列表分为几个部分:
第 0 部分 -> 过期项目
第 1 节 -> 今日项目
第 2 部分 -> 明天的项目
第 3 部分 -> 即将推出的项目
第 4 节 -> 某天项目
第 5 部分 -> 已完成的项目
正如您想象的那样,午夜过后,剩余的 TODAY 项目应该传递到 OVERDUE 部分,TOMORROW 项目应该传递到 TODAY 部分,而一些 UPCOMING 项目应该传递到 TOMORROW 部分。
应用程序现在的样子,如果用户在早上启动应用程序,所有项目都会显示在各自的部分中。
当用户在午夜之前使用应用程序并且刚刚过了午夜时,就会出现此问题。这些项目不会自动传递到正确的部分。
我只能在模拟器上测试应用,但我猜这个问题也会在真机上发生。
所有项目都有一个名为 todoDueDate 的属性,并且所有项目的日期值都具有相同的时间部分,所有项目的时间都设置为上午 10:00。
为了将项目分配到部分中,我使用了一个名为 sectionIdentifier 的临时属性,该属性在名为 ToDoItem 的 NSManagedObject 子类中定义。
这里有方法:
-(NSString *)sectionIdentifier{
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"];
[self didAccessValueForKey:@"sectionIdentifier"];
if (!tmp){
NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);
NSDate *today = [NSDate date];
NSDate *date = self.todoDueDate;
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setCalendar:calendar];
[components setYear:2065];
[components setMonth:11];
[components setDay:12];
NSDate *dateFuturoSomeday = [calendar dateFromComponents:components];
NSCalendar *calendar1 = [NSCalendar currentCalendar];
NSDateComponents *components1 = [[NSDateComponents alloc] init];
[components1 setCalendar:calendar1];
[components1 setYear:2065];
[components1 setMonth:11];
[components1 setDay:13];
NSDate *dateFuturoCompleted = [calendar1 dateFromComponents:components1];
NSDateComponents *date1Components = [calendar components:comps
fromDate: today];
NSDateComponents *date2Components = [calendar components:comps
fromDate: date];
NSDateComponents *date3Components = [calendar components:comps
fromDate: dateFuturoSomeday];
NSDateComponents *date4Components = [calendar components:comps
fromDate: dateFuturoCompleted];
today = [calendar dateFromComponents:date1Components];
date = [calendar dateFromComponents:date2Components];
dateFuturoSomeday = [calendar dateFromComponents:date3Components];
dateFuturoCompleted = [calendar dateFromComponents:date4Components];
NSInteger daysAfterToday = [calendar components:NSDayCalendarUnit
fromDate:today toDate:date options:0].day;
// NSString *section;
if (daysAfterToday < 0) {
tmp = @"0";
} else if (daysAfterToday == 0) {
tmp = @"1";
} else if (daysAfterToday > 0 && daysAfterToday < 2) {
tmp = @"2";
}
else if ([self.todoDueDate isEqualToDate:dateFuturoSomeday]){
tmp = @"4";
}
else if ([self.todoDueDate isEqualToDate:dateFuturoCompleted]){
tmp = @"5";
}
else {
tmp = @"3";
}
[self setPrimitiveValue:tmp forKey:@"sectionIdentifier"];
}
return tmp;
}
我可以做些什么来实现所需的行为?这意味着,当用户在午夜使用应用程序时,项目应自动传递到预期部分。
谢谢。
【问题讨论】: