日期分区表?

时间:2010-03-27 17:54:17

标签: iphone uitableview

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

我希望创建一个带有此日期的分段表格视图,就像点击“列表”视图时随iPhone附带的日历应用程序一样。您可以看到只有有事件发生日期的部分。

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

由于

2 个答案:

答案 0 :(得分:2)

我为Reconnected做了类似的事情,除了我的部分多年(参见历史截图)。

  1. 按日期键排序数组。
  2. 从第一项开始。第一个项目的日期代表第一个细分。就我而言,我只关心这一年。
  3. 为包含日期的部分创建数组。将当前检查的内容添加到该部分的数组中。将节的数组添加到另一个数组中,该数组将是表中所有节的数组。
  4. 转到下一个项目。如果下一个项目的日期等于上一个项目的日期,则将当前项目添加到当前部分的数组中。否则,请将步骤#3应用到新日期。
  5. 从plist重复上一步中的其余数组。
  6. 在第5步结束时,您应该有一个部分数组。从该部分,您可以向您发送一条消息,其中包含您已添加到表格中的NSDictionary的数量,该部分将代表表格中的每一行。

答案 1 :(得分: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:文档中的方法有人知道它是否是更好地使用它?

由于