从plist中拉出NSDates,只在tableview中显示今天和明天的事件

时间:2011-11-16 20:58:45

标签: iphone objective-c ios xcode

在一个plist中,我有几个字典(事件,例如足球比赛),如下所示:

<dict>
    <key>date</key>
    <date>2011-11-24T00:00:00Z</date>
    <key>title</key>
    <string>Amsterdam - Roosendaal</string>
</dict>
<dict>
    <key>date</key>
    <date>2012-06-25T00:00:00Z</date>
    <key>title</key>
    <string>Rotterdam - Utrecht</string>
</dict>

我有一个tableview,其中有一些名为'Today'和'Tomorrow'的部分。现在,无论何时发生今天的事件,我都希望在“今天”部分看到它,明天的活动计划在“明天”。

编辑:我现在有了这段代码:

self.Array = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"matches" ofType:@"plist"]];

for (int i=0; i<[Array count]; i++) {
        NSDate *datum = [[Array objectAtIndex:i] objectForKey:@"datum"];
        NSCalendar *cal = [NSCalendar currentCalendar];
        NSDateComponents *components = [cal components:       (NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:[NSDate date]];
        NSDate *today = [cal dateFromComponents:components];
        components = [cal components:(NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:datum];
        NSDate *otherDate = [cal dateFromComponents:components];

        if([today isEqualToDate:otherDate]) {

        //do stuff

        NSLog(@"%i, %@", i, otherDate);
        NSLog(@"Match is today");

    }
    else {
        NSLog(@"Match is not today");
    }

从NSLog看来,它以正确的方式进行比较。然而,我现在想要在一个部分中显示那些具有今天日期的字典。我想因此我必须创建一个它们的数组(可能通过添加'// do stuff'区域中的东西,比如addObject?)有什么想法吗?

2 个答案:

答案 0 :(得分:0)

首先,不要与字符串进行比较,将数据保存在其中NSDate

然后尝试

 if ( [myDate timeIntervalSinceDate:dateOfEvent] < 86400 ) { // less than a day apart.
 }

(使用[myDate isEqualToDate:dateOfEvent]进行精确比较(到第二次),所以不要使用它。

你必须对此进行微调以确定&#34; day&#34;实际上,你需要找到日期界限,但这不应该太难。

如果要向用户显示日期,请使用NSDateFormatter

您还可以使用NSDateFormatter将这些转换为仅日期(无时间戳),然后比较这些字符串,以便您比较2011/16/11到2011/15/11。 像这样:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setTimeStyle:NSDateFormatterNoStyle];
NSDate *today = [NSDate date];
NSDate *tomorrow = [today dateByAddingTimeInterval:86400];
NSString *eventDateString = @"2011-11-24T00:00:00Z";    // get your date string from the array
[df setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; // this matches your dictionary's format

NSDate *eventDate = [df dateFromString:eventDateString];

// now you have 3 dates.  convert them to timeless strings using another date formatter.
NSDateFormatter *timeless = [[NSDateFormatter alloc] init];
[timeless setTimeStyle:NSDateFormatterNoStyle];
[timeless setDateStyle:NSDateFormatterMediumStyle];

NSString *todayString    = [timeless stringFromDate:today];
NSString *tomorrowString = [timeless stringFromDate:tomorrow];
eventDateString          = [timeless stringFromDate:eventDate];
if ( [todayString isEqualToString:eventDateString ] ) {
    NSLog(@" today %@  == event: %@", todayString, eventDateString);
} else if ( [tomorrowString isEqualToString:eventDateString] ) {
    NSLog(@" tomorrow %@  == event: %@", tomorrowString, eventDateString);
}
[df release];
[timeless release];

答案 1 :(得分:0)

您还应该查看NSCalendar和NSDateComponents。您可以使用它们将日期(或日期+月份+年份或某个时代的绝对日期)作为日期所在的整数来获取。这样,您可以在同一天,沿着日历日的边界进行两次比较。 (它还会考虑到夏令时和其他奇怪的事情)。

您也可以使用它们将当前日期([NSDate日期])转换为当天开始的日期。例如,在课程的苹果文档中。

[edit]你有了这个部分(听起来像你这样做),然后你说你想把它显示在一个带有部分的表中。基本上在相同/天的测试之后想要建立一个二维数组(更具体地说,一个NSArray有2个对象,它们本身就是NSMutableArrays)。您添加了今天对象的NSMutableArrays之一,另一个是将明天对象添加到。

完成后,您可以填写tableview委托和数据源方法来填充表。 (例如,节的数量将是外部数组的计数,每个单元格的索引路径将对应于外部数组(节)和内部可变数组(行)。)使用TableView编程指南获取更多详细信息。