2010-03-27 92 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:方法了嗎?更好地使用這個呢?

謝謝