2010-03-27 57 views
1

我有一个plist,它包含一个代表某个事件的NSDictionary的数组,每个字典包含关于事件的一些信息和一个带有事件日期的NSDate。日期分区表?

我想非常创建这个日期分段表视图就像当你点击“列表”视图所附带iPhone的日历应用。你可以看到只有有事件日期的部分。

那么最好的方法来找出开始有多少NSDictionary的具有相同的日期(所以我知道有多少部分创建和每个部分有多少行,因为每个部分将有不同的数量或行)。

感谢

回答

2

我确实非常相似,这为重新连接,除了我的部分是多年(见历史截图)的东西。

  1. 排序阵列由日期键。
  2. 从第一项开始。第一项的日期代表第一段。就我而言,我只关心这一年。
  3. 为日期的部分创建一个数组。将当前检查的内容添加到部分的数组中。将该节的数组添加到另一个将成为表中所有节的数组的数组。
  4. 继续下一项。如果下一个项目的日期等于上一个项目的日期,则将当前项目添加到当前部分的数组中。否则,将第3步应用到新日期。
  5. 从你的plist中重复前面的步骤来获得数组的其余部分。

在步骤5结束时,你应该有部分的阵列。从该部分中,您可以向它发送一条消息,说明您添加到表示表中每行的部分中的NSDictionary的数量。

0

一点解决这个演出之后就是我想出了,此刻它只是一个基础工具,以保持它的清晰。

#import <Foundation/Foundation.h> 

NSDate* normalizedDateWithDate(NSDate *date) { 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
    NSDateComponents *comp = [calendar components:unitFlags fromDate:date]; 

    return [calendar dateFromComponents:comp]; 
} 


int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSString *plistPath = @"flights.plist"; 
    NSArray *array = [[NSArray alloc] initWithContentsOfFile:plistPath]; 
    NSMutableSet *flightDates = [[NSMutableSet alloc] init]; 

    for (NSDictionary *oneFlight in array) 
      [flightDates addObject:normalizedDateWithDate([oneFlight objectForKey:@"flightDate"])]; 

    NSLog(@"Number of Sections Required: %d", [flightDates count]); 

    NSMutableDictionary *datesAndFlights = [[NSMutableDictionary alloc] init]; 



    for (NSDate *fDate in flightDates) { 
     NSMutableArray *sectionFlights = [[NSMutableArray alloc] init]; 
     for (NSDictionary *oneFlight in array) {  
      if ([normalizedDateWithDate([oneFlight objectForKey:@"flightDate"]) isEqualToDate: normalizedDateWithDate(fDate)]) 
      { 
       [sectionFlights addObject:oneFlight]; 
      } 
     } 
     [datesAndFlights setObject:sectionFlights forKey:normalizedDateWithDate(fDate)]; 
     [sectionFlights release]; 
    } 


    NSEnumerator *enumerator = [datesAndFlights keyEnumerator]; 
    NSDate *key; 

    while ((key = [enumerator nextObject])) { 
     NSLog(@"Key: %@", key); 
     for (NSDictionary *oneFlight in [datesAndFlights objectForKey:key]) { 
      NSLog(@"flightNumber: %@ and Total Time: %@", [oneFlight objectForKey:@"flightNumber"], [oneFlight objectForKey:@"totalTime"]); 
     } 
    } 

    [array release]; 
    [flightDates release]; 
    [datesAndFlights release]; 

    [pool drain]; 
    return 0; 
} 

这正是我已成功地组装起来,似乎可行,但如果任何人都可以看到一个方法,使这更好​​或更简洁请说出来!另外我用来确保日期的函数总是在时间00:00:00,当我比较它时,我已经在文档中看到NSCalendar - rangeOfUnit:startDate:interval:forDate:方法了吗?更好地使用这个呢?

谢谢