2012-10-31 51 views
0

我在這裏試圖完成的是將tableView與原型單元格對齊,並在每個單元格中顯示一年或兩年的日期。我得到它通過使用下面的代碼標籤顯示今天的日期:在桌面視圖中顯示一年的日期

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 
NSDate *dateNow = [NSDate date]; 
dateArray = [NSMutableArray arrayWithObjects:[dateFormatter stringFromDate:dateNow], nil]; 

它的工作原理,以一個日期(今天的日期)添加到第一個單元格。我無法弄清楚如何讓它以1的間隔添加所有的日子。任何幫助?

我顯示與此代碼數組中的信息:在的cellForRowAtIndexPath

static NSString *CellIdentifier = @"Cell"; 

Custom *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
cell.dateLabel.text = [dateArray objectAtIndex:indexPath.row]; 

回答

0

在這裏你去,

在viewDidLoad中

dateArray = [[NSMutableArray alloc] init]; //dateArray is global 

NSDate *thisDate, *nextDate; 
thisDate = [NSDate date]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 
[dateArray addObject: [dateFormatter stringFromDate:thisDate]]; 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
components.day = 1; 

for (int i = 0; i<365; i++) //Not considering leap years 
{ 
     nextDate = [gregorian dateByAddingComponents:components toDate:thisDate options:0]; 
     [dateArray addObject:[dateFormatter stringFromDate:nextDate]]; 
     thisDate = nextDate; 
} 

cell.dateLabel.text = [dateArray objectAtIndex:indexPath.row]; 
0

你不需要維護一組日期。如果您想要顯示n行,則只需將n天添加到您的開始日期並使用它即可。

所以你必須存儲在一個實例變量開始日期:

NSDate *_startDate; 

要確定應該有多少行是TableView中,你要搞清楚有多少天是在這一年(我要去假設你只顯示一年):

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // get the calendar 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    // get the date that points to the first day of the first month of the year containing the start date 
    // note that we include the era, because some calendars have more than an "AD"/"BC" kind of era 
    NSDateComponents *yearStartComponents = [calendar components:(NSEraCalendarUnit | NSYearCalendarUnit) fromDate:_startDate]; 
    [yearStartComponents setMonth:1]; 
    [yearStartComponents setDay:1]; 
    NSDate *startOfYear = [calendar dateFromComponents:yearStartComponents]; 

    NSDateComponents *yearDiff = [[NSDateComponents alloc] init]; 
    [yearDiff setYear:1]; 

    // add one year to that date 
    NSDate *startOfNextYear = [calendar dateByAddingComponents:yearDiff toDate:startOfYear options:0]; 

    // figure out how many days were between the two dates 
    NSDateComponents *dayDiff = [calendar components:NSDayCalendarUnit fromDate:startOfYear toDate:startOfNextYear options:0]; 

    return [dayDiff day]; 
} 

然後當你需要的細胞,你可以只使用了indexPath的‘行’從開始日期的天數:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = ...; 

    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *diff = [[NSDateComponents alloc] init]; 
    [diff setDay:[indexPath row]]; 
    NSDate *date = [calendar dateByAddingComponents:diff toDate:_startDate options:0]; 

    NSLocale *locale = [NSLocale currentLocale]; 
    NSString *formatted = [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterNoStyle locale:locale]; 

    [[cell textLabel] setText:formatted]; 

    return cell; 
} 

有這個方法有幾個好東西:

  1. 它的工作原理一年的長度無關。今年的年度是否有353,355,365,366或384天,這是可行的。
  2. 無論當前日曆如何,它都能正常工作。那裏不僅僅是格里曆日曆。 NSCalendar支持格里曆,佛教,中文,希伯來文,伊斯蘭教,伊斯蘭文明,日本,中華民國,波斯,印度和ISO8601日曆。
  3. 你不是硬編碼格式字符串。通過使用NSDateFormatterStyles,無論是「2012年5月12日」還是「2012年12月5日」,或者完全不同的東西,您都可以使用適當的簡短符號表示日期。
相關問題