2011-08-23 79 views
1

OK ...所以我試圖使用UITableView並將它分成52個部分..一年52周...每個部分都有7天(細胞)爲一週。我希望每個部分的頭部都說「每個月,每一年的每週'」。每次我嘗試在相應的一週的headerSection中打印字符串時,都沒有顯示出來。有沒有辦法使用標題部分號碼將該周的第一天設置到sectionHeader中?下面是我一直在努力工作的代碼...這似乎是有道理的。但我做錯了什麼。我真的很感激任何幫助。先謝謝你。從週數中獲取日期,節標題編號爲本週

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSDate *now = [NSDate date]; 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *comp = [gregorian components:NSYearCalendarUnit fromDate:now]; 
    [comp setWeek:section]; 
    [comp setDay:1]; 
    NSDate *resultDate = [gregorian dateFromComponents:comp]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 
    [formatter setDateFormat:@"EEE, MMM d, ''yy"]; 

    NSString *myDateString = [formatter stringFromDate:resultDate]; 

    NSString *sectionHeader = nil; 

    switch (section) { 
    case 0: 
     sectionHeader = myDateString; 
     break; 
    case 1: 
     sectionHeader = myDateString; 
     break; 
    case 2: 
     sectionHeader = myDateString; 
     break; 
    default: 
     break; 
    } 

    return sectionHeader; 
} 
+1

你確定一年有52周嗎? –

回答

2

我不知道你爲什麼決定在代碼中使用switch語句,但它提供絕對沒有目的,造成至少你的一些問題。對於除三週以外的所有事件(switch語句中涵蓋的三種情況),您的titleForHeaderSection:方法將返回nil。相反,你應該嘗試這樣的事:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSDate *now = [NSDate date]; 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *comp = [gregorian components:NSYearCalendarUnit fromDate:now]; 

    [comp setWeek:(section + 1)]; // section numbers start at 0, so need to add 1 
    [comp setWeekDay:1]; // Note that this is very different than setting day to 1 

    NSDate *resultDate = [gregorian dateFromComponents:comp]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MMM d, yyyy"]; 

    NSString *myDateString = [formatter stringFromDate:resultDate]; 

    [gregorian release]; // Clean up allocated objects by releasing them 
    [formatter release]; 

    return [NSString stringWithFormat:@"Week of %@", myDateString]; 
} 

注意,我一天上文,而不是平日,因爲我相信你正在試圖讓這一週的第一天的日期。

+0

它完美的作品。再次感謝你,你不知道我多麼感激這個幫助。我已經花了幾天在那個。此外,如果您不介意,您認爲將每月的每日數字設置爲最佳方式是什麼?例如0節將是22日,23日,24日,25日,26日,27日和28日,下一節將繼續從29日開始,依此類推。我應該在每週的7天內創建一個所有這些周的plist嗎?創建365個字符的數組似乎有點多餘 – Chris

+0

您可以將類似於上述代碼的代碼添加到您的'tableView:cellForRowAtIndexPath:'方法中,因爲NSIndexPath爲您提供了段和行號。或者,您可以在'viewDidLoad:'中爲節標題和行標題進行計算,並將它們存儲在兩個NSArrays中,並簡單地在'titleForHeaderInSection:'和'cellForRowAtIndexPath:'方法中獲取這些值。 – glorifiedHacker

+0

再次感謝,我很感激。它進行了一些操作,但效果很好。 – Chris