2014-01-18 4 views
1

Я использую transient attribute для распространения core data objects в table view sections. transient attribute называется sectionIdentifier и определяется в зависимости от атрибута todoDueDate. мне нужно фильтровать объекты таким образом, чтобы все должны быть включены в одной из следующих групп, и только в одном:NSDate фильтрующие шкафы

1. sectionIdentier = 0, **OVERDUE** , todoDueDate < today 
2. sectionIdentier = 1, **TODAY** , todoDueDate = today 
3. sectionIdentier = 2, **TOMORROW** , todoDueDate >today AND todoDueDate= = tomorrow 
4. sectionIdentier = 3, **UPCOMING** , todoDueDate > today AND todoDueDate!=tomorrow 

С моим текущим кодом, я могу фильтровать объекты для случаи 1,2 и 4 (я должен отбросить здесь объекты на завтра). Я попробовал несколько способов фильтрации объектов для случая 3, но не успел. Прошу вас помочь мне фильтрации для случая 3. Вот мой текущий код:

-(NSString *)sectionIdentifier{ 

    [self willAccessValueForKey:@"sectionIdentifier"]; 
    NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"]; 
    [self didAccessValueForKey:@"sectionIdentifier"]; 

    if (!tmp){ 

     NSDate *date = self.todoDueDate; 
     NSDate *todayDate = [NSDate date]; 


     NSLog(@"date= %@",date); 
     NSLog(@"todayDate = %@",todayDate); 


     NSCalendar *calendar = [NSCalendar currentCalendar]; 
     NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit); 
     NSDateComponents *date1Components = [calendar components:comps fromDate:date]; 
     NSDateComponents *date2Components = [calendar components:comps fromDate:todayDate]; 

     date = [calendar dateFromComponents:date1Components]; 
     todayDate = [calendar dateFromComponents:date2Components]; 


     if([date 
      compare:todayDate] == NSOrderedAscending) { 
      tmp = @"0";//OVERDUE 
     } 
     if([date 
      compare:todayDate] == NSOrderedDescending) { 
      tmp = @"3";//UPCOMING BUT NOT TOMORROW(PENDING THIS PART) 
     } 
     if ([date 
      compare:todayDate] == NSOrderedSame) { 
      tmp = @"1";//TODAY 
     } 


    //TOMORROW COMES HERE 



     NSLog(@"Tmp= %@",tmp); 

     [self setPrimitiveValue:tmp forKey:@"sectionIdentifier"]; 

    } 
    return tmp; 

} 

Вот мой обновленный код:

-(NSString *)sectionIdentifier{ 

    [self willAccessValueForKey:@"sectionIdentifier"]; 
    NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"]; 
    [self didAccessValueForKey:@"sectionIdentifier"]; 

    if (!tmp){ 
     NSDate *today = [NSDate date]; 
     NSDate *date = self.todoDueDate; 
     NSCalendar *calendar; 
     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 == 1) { 
      tmp = @"2"; 
     } else { 
      tmp = @"3"; 
     } 


     NSLog(@"TODAY = %@", today); 
     NSLog(@"DATE = %@", date); 
     NSLog(@"DAYS AFTER TODAY = %ld",(long)daysAfterToday); 

     NSLog(@"Tmp= %@",tmp); 

     [self setPrimitiveValue:tmp forKey:@"sectionIdentifier"]; 

    } 
    return tmp; 

} 

А вот результаты протоколирования:

2014-01-17 22:35:53.576 To-Do Pro Light[4124:a0b] TODAY = 2014-01-18 05:35:53 +0000 
2014-01-17 22:35:53.619 To-Do Pro Light[4124:a0b] DATE = 2014-01-13 04:08:32 +0000 
2014-01-17 22:35:53.656 To-Do Pro Light[4124:a0b] DAYS AFTER TODAY = 0 
2014-01-17 22:35:53.664 To-Do Pro Light[4124:a0b] Tmp= 1 
2014-01-17 22:35:53.739 To-Do Pro Light[4124:a0b] TODAY = 2014-01-18 05:35:53 +0000 
2014-01-17 22:35:53.743 To-Do Pro Light[4124:a0b] DATE = 2014-01-18 04:13:39 +0000 
2014-01-17 22:35:53.748 To-Do Pro Light[4124:a0b] DAYS AFTER TODAY = 0 
2014-01-17 22:35:53.752 To-Do Pro Light[4124:a0b] Tmp= 1 
2014-01-17 22:35:53.757 To-Do Pro Light[4124:a0b] TODAY = 2014-01-18 05:35:53 +0000 
2014-01-17 22:35:53.762 To-Do Pro Light[4124:a0b] DATE = 2014-01-19 04:16:14 +0000 
2014-01-17 22:35:53.766 To-Do Pro Light[4124:a0b] DAYS AFTER TODAY = 0 
2014-01-17 22:35:53.770 To-Do Pro Light[4124:a0b] Tmp= 1 
2014-01-17 22:35:53.776 To-Do Pro Light[4124:a0b] TODAY = 2014-01-18 05:35:53 +0000 
2014-01-17 22:35:53.779 To-Do Pro Light[4124:a0b] DATE = 2014-01-25 04:11:34 +0000 
2014-01-17 22:35:53.825 To-Do Pro Light[4124:a0b] DAYS AFTER TODAY = 0 
2014-01-17 22:35:53.831 To-Do Pro Light[4124:a0b] Tmp= 1 

ответ

1

Просто спросите календарь для вычисления количество дней с сегодняшнего дня до установленного срока и проверьте, что номер:

 NSInteger daysAfterToday = [calendar components:NSDayCalendarUnit 
      fromDate:today toDate:date options:0].day; 
     NSString *section; 
     if (daysAfterToday < 0) { 
      section = @"0"; 
     } else if (daysAfterToday == 0) { 
      section = @"1"; 
     } else if (daysAfterToday == 1) { 
      section = @"2"; 
     } else { 
      section = @"3"; 
     } 
+0

Я также попробую ваше предложение, кажется, гораздо проще реализовать и требуется всего 12 строк кода. Очень умно. – mvasco

+0

+1 очень умный действительно –

+0

Я включил объекты, которые следует сортировать по четырем возможным группам, но после запуска приложения все объекты включены в группу 1 ... – mvasco

1

Оставив ваш код немного, вы можете использовать сообщение dateOnly вернуть только дату, нет времени компонент (не ставить весь этот код в NSDate категории):

-(NSDate *)dateOnly { 
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *components = [calendar components:flags fromDate:self]; 
    return [calendar dateFromComponents:components]; 
} 

Это вернет вас сегодня:

+(NSDate *)today { 
    return [[NSDate now] dateOnly]; 
} 

Тогда, учитывая это:

-(NSDate *)addDays:(NSInteger)days { 
    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 
    [offsetComponents setDay:days]; 
    return [[NSDate calendar] dateByAddingComponents:offsetComponents toDate:self options:0]; 
} 

Вы можете завтра:

+(NSDate *)tomorrow { 
    return [[NSDate today] addDays:1]; 
} 

Для упрощения кода вы можете использовать [NSDate today] и [NSDate tomorrow].

Кроме того, помните, чтобы лишить компоненты времени от todoDueDate:

NSDate *date = [self.todoDueDate dateOnly]; 
NSDate *todayDate = [NSDate today]; 
NSDate *tomorrowDate = [NSDate tomorrow]; 

Ваша логика может быть упрощена:

  1. sectionIdentier = 0, ПРОСРОЧЕНО, todoDueDate < сегодня
  2. sectionIdentier = 1, СЕГОДНЯ, todoDueDate = сегодня
  3. sectionIdentier = 2, ЗАВТРА, todoDueDate = завтра
  4. sectionIdentier = 3, КАЛЕНДАРЬ, todoDueDate> завтра

В коде:

if ([date compare:todayDate] == NSOrderedAscending) { 
    tmp = @"0";//OVERDUE 
} 
else if ([date isEqualToDate:todayDate]) { 
    tmp = @"1";//TODAY 
} 
else if ([date isEqualToDate:tomorrowDate]) { 
    tmp = @"2";//TOMORROW 
} 
else if ([date compare:tomorrowDate] == NSOrderedDescending) { 
    tmp = @"3";//UPCOMING 
} 
+0

спасибо, я попробую ваше предложение, но мне нужна ваша помощь, чтобы различать только завтрашний день и предстоящий, но не завтра. – mvasco

+0

Добавлена ​​новая логика ... –

+0

Спасибо, я не думал об этом умном решении .... – mvasco

Смежные вопросы