Vérifier si un tableau d'objects personnalisés contient un object avec une certaine date

J'ai un tableau d' event objects . L'object a plusieurs attributes. L'un des attributes est un NSDate eve_date .

Maintenant, je veux vérifier si ce tableau d'objects contient un certain NSDate d

Je fais ce qui suit

 if([[matches valueForKey:@"eve_date"] containsObject:d]){ NSLog(@"contains object"); }else{ NSLog(@"does not contains object"); } 

Mais ça ne fonctionne pas. Quelqu'un peut-il m'aider ?

Sincères amitiés

MODIFIER

Ok, laissez-moi être plus clair. Je fais une application de calendar. J'ai récupéré tous les events du mois. Ce que je dois faire maintenant est de placer un marqueur sur mon calendar à la bonne date. Donc j'ai ceci dans une fonction.

 NSLog(@"Delegate Range: %@ %@ %d",start,end,[start daysBetweenDate:end]); self.dataArray = [NSMutableArray array]; self.dataDictionary = [NSMutableDictionary dictionary]; NSDate *d = start; while(YES){ for (Event *event in matches) { if([event.eve_date isEqualToDate:d]){ // (self.dataDictionary)[d] = save event title in here [self.dataArray addObject:@YES]; //place marker on date 'd' }else{ [self.dataArray addObject:@NO]; // don't place marker } } NSDateComponents *info = [d dateComponentsWithTimeZone:calendar.timeZone]; info.day++; d = [NSDate dateWithDateComponents:info]; if([d compare:end]==NSOrderedDescending) break; } 

Mais maintenant je suis en boucle 31 fois (nombre de jours hors du mois) à travers mon tableau d'events. (Ce n'est probablement pas la meilleure solution de pratique ???)

Je pense aussi que le problème est que l'heure de la date n'est pas la même. Par exemple:

 eve_date --> 2013-08-13 12:00 d --> 2013-08-13 15:00 

Donc, je devrais probablement utiliser un NSDateformatter pour get uniquement la date elle-même sans le time?

Ai-je raison ?

Je ne suis pas très familier avec KVC, mais si la solution n'a pas besoin d'utiliser KVC, vous pouvez juste itérer:

 NSDate *dateToCompare = ...; BOOL containsObject = NO; for (MyEvent *e in matches) { if ([e.eve_date isEqualToDate:dateToCompare]) { containsObject = YES; break; } } if (containsObject) NSLog(@"Contains Object"); else NSLog(@"Doesn't contain object"); 

J'ai joué avec KVC et j'ai essayé une solution avec ça aussi. Vous ne valueForKeyPath que valueForKeyPath au lieu de valueForKey

 if ([[matches valueForKeyPath:@"eve_date"] containsObject:d]) { NSLog(@"Contains object"); } else { NSLog(@"Does not contain object"); } 

NSDate est un point absolu dans le time. Pour vérifier si une date tombe un jour donné, vous devez la comparer avec le "début de la journée" et le "début de la journée suivante".

Le (pseudo) code suivant devrait démontrer l'idée:

 NSDate *start, *end; // your given range NSDate *currentDay = "beginning of" start; // while currentDay < end: while ([currentDay compare:end] == NSOrderedAscending) { NSDate *nextDay = currentDay "plus one day"; for (Event *event in matches) { // if currentDay <= event.eve_date < nextDay: if ([event.eve_date compare:currentDay] != NSOrderedAscending && [event.eve_date compare:nextDay] == NSOrderedAscending) { // ... } } currentDay = nextDay; } 

Le "début d'un jour" peut être calculé comme suit:

 NSCalendar *cal = [NSCalendar currentCalendar]; NSDate *aDate = ...; NSDate *beginningOfDay; [cal rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfDay interval:NULL forDate:aDate];