2015-03-13 14 views
-1

苹果示例项目DateSectionTitles演示了如何按年份和月份对各部分进行分组,以及如何将它扩展为支持年月日和星期几?如何从年月日星期几之和中提取日期分量乘以iOS中的某个整数?

sectionIdentifier是源自持续日期属性timestamp的瞬态属性。

- (NSString *)sectionIdentifier { 

    // Create and cache the section identifier on demand. 

    [self willAccessValueForKey:@"sectionIdentifier"]; 
    NSString *tmp = [self primitiveSectionIdentifier]; 
    [self didAccessValueForKey:@"sectionIdentifier"]; 

    if (!tmp) { 
     /* 
     Sections are organized by month and year. Create the section identifier 
     as a string representing the number (year * 1000 + month); 
     this way they will be correctly ordered chronologically regardless of 
     the actual name of the month. 
     */ 
     NSCalendar *calendar = [NSCalendar currentCalendar]; 

     NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit) 
           fromDate:[self timeStamp]]; 
     tmp = [NSString stringWithFormat:@"%d", [components year] * 1000 + [components month]]; 
     [self setPrimitiveSectionIdentifier:tmp]; 
    } 
    return tmp; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> theSection = [[self.fetchedResultsController sections] objectAtIndex:section]; 

    /* 
    Section information derives from an event's sectionIdentifier, which is a string representing the number (year * 1000) + month. 
    To display the section title, convert the year and month components to a string representation. 
    */ 
    static NSDateFormatter *formatter = nil; 

    if (!formatter) 
    { 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setCalendar:[NSCalendar currentCalendar]]; 

     NSString *formatTemplate = [NSDateFormatter dateFormatFromTemplate:@"MMMM YYYY" options:0 locale:[NSLocale currentLocale]]; 
     [formatter setDateFormat:formatTemplate]; 
    } 

    NSInteger numericSection = [[theSection name] integerValue]; 
    NSInteger year = numericSection/1000; 
    NSInteger month = numericSection - (year * 1000); 

    NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
    dateComponents.year = year; 
    dateComponents.month = month; 
    NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:dateComponents]; 

    NSString *titleString = [formatter stringFromDate:date]; 

    return titleString; 
} 

我不知道计算年月日和星期几的确切算法,如下面的代码。

tmp = [NSString stringWithFormat:@"%d", [components year] * 1000 + [components month]]; 

并计算出数据源方法。

id <NSFetchedResultsSectionInfo> theSection = [[self.fetchedResultsController sections] objectAtIndex:section]; 

NSInteger numericSection = [[theSection name] integerValue]; 
NSInteger year = numericSection/1000; 
NSInteger month = numericSection - (year * 1000); 

回答

1

你需要一个“算法”,对于每天创建一个不同的结果(平日是一样的一天。没有“周四,13 2015年3月”)。

比方说,你有2015年3月13日。一个好的唯一字符串是20150313.或year * 10000 + month * 100 + day

例如为:

NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) 
               fromDate:[self timeStamp]]; 
tmp = [NSString stringWithFormat:@"%d", [components year] * 10000 + [components month] * 100 + [components day]]; 

然后反转计算找回各个组件:

NSInteger numericSection = [[theSection name] integerValue]; 
NSInteger year = numericSection/10000; 
NSInteger month = (numericSection - (year * 10000))/100; 
NSInteger day = (numericSection - (year * 10000 + month * 100)) 

或者从节中的对象的一个​​刚刚拿到的NSDate:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> theSection;// = [[self.fetchedResultsController sections] objectAtIndex:section]; 
    static NSDateFormatter *formatter = nil; 

    if (!formatter) 
    { 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setCalendar:[NSCalendar currentCalendar]]; 

     NSString *formatTemplate = [NSDateFormatter dateFormatFromTemplate:@"MMMM yyyy dd EEEE" options:0 locale:[NSLocale currentLocale]]; 
     [formatter setDateFormat:formatTemplate]; 
    } 

    APLEvent *event = [[theSection objects] firstObject]; 
    if (event) { 
     NSDate *date = [event timeStamp]; 
     return [formatter stringFromDate:date]; 
    } 
    return nil; 
} 
相关问题