NSFetchedResultsController:ReOrder Sections

时间:2014-06-18 18:53:52

标签: uitableview core-data ios7 nsfetchedresultscontroller

我按照Apple的示例来设置我的部分:

https://developer.apple.com/library/ios/samplecode/DateSectionTitles/Listings/DateSectionTitles_APLEvent_m.html

我的部分目前按以下顺序显示:

Section 0: "Upcoming"
Section 1: "Today"
Section 2: "Past"

我在NSManagedObject .m文件中使用的代码:

#pragma mark - Transient properties

- (NSString *)sectionIdentifier
{
    // Create and cache the section identifier on demand.

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

    if (!tmp)
    {
        NSDate *dateToCompare = [self getUTCFormateDate:[self startDate]];
        NSLog(@"********Date To Compare****** %@", dateToCompare);

        NSCalendar* calendar = [NSCalendar currentCalendar];
        NSDate* now = [NSDate date];
        NSDateFormatter *format = [[NSDateFormatter alloc] init];
        format.dateFormat = @"dd-MM-yyyy";
        NSString *stringDate = [format stringFromDate:now];
        NSDate *todaysDate = [format dateFromString:stringDate];

        NSInteger differenceInDays =
        [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:dateToCompare] -
        [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:todaysDate];

        NSString *sectionString;

        if (differenceInDays == 0)
        {
            sectionString = kSectionIDToday;
        }
        else if (differenceInDays < 0)
        {
            sectionString = kSectionIDPast;
        }
        else if (differenceInDays > 0)
        {
            sectionString = kSectionIDUpcoming;
         }

        tmp = sectionString;
        [self setPrimitiveSectionIdentifier:tmp];
    }

    return tmp;
}

-(NSDate *)getUTCFormateDate:(NSDate *)localDate
{
    NSDateFormatter *dateFormatter;
    if (!dateFormatter)
    {
        dateFormatter = [[NSDateFormatter alloc] init];
    }
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    NSString *dateString = [dateFormatter stringFromDate:localDate];
    NSDate *dateFromString = [[NSDate alloc] init];
    dateFromString = [dateFormatter dateFromString:dateString];
    return dateFromString;
}

#pragma mark - Time stamp setter

- (void)setStartDate:(NSDate *)newDate
{
    // If the time stamp changes, the section identifier become invalid.
    [self willChangeValueForKey:@"startDate"];
    [self setPrimitiveStartDate:newDate];
    [self didChangeValueForKey:@"startDate"];

    [self setPrimitiveSectionIdentifier:nil];
}


#pragma mark - Key path dependencies

+ (NSSet *)keyPathsForValuesAffectingSectionIdentifier
{
    // If the value of timeStamp changes, the section identifier may change as well.
    return [NSSet setWithObject:@"startDate"];
}

在我的tableViewController中,我按如下方式设置了NSFetchedResults:

- (NSFetchedResultsController *)fetchedResultsController
{
    if(_fetchedResultsController!=nil)
    {
        return  _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity"
                                              inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *firstSort = [[NSSortDescriptor alloc] initWithKey:@"startDate"
                                                              ascending:NO];


    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:firstSort,nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest
                                                                       managedObjectContext:self.managedObjectContext
                                                                         sectionNameKeyPath:@"sectionIdentifier"
                                                                                  cacheName:nil];
    self.fetchedResultsController.delegate = self;
    return self.fetchedResultsController;
}

问题1:如何按以下顺序显示部分:

Section 0: Today
Section 1: Upcoming
Section 2: Past

问题2:在每个部分中,如何根据每个对象中名为"modified"的属性对行进行排序?

1 个答案:

答案 0 :(得分:1)

部分和行排序都是100%依赖于排序描述符。您希望第一个排序描述符将所有内容排序到正确的部分,然后您的以下排序描述符将对这些部分中的行进行排序。

例如,如果你想要三个部分基于&#34; group&#34;然后你想要按组名称排序的行,你可以将排序描述符添加为:

NSArray *descriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"group" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
[fetchRequest setSortDescriptors:descriptors];

NSFetchedResultsController的部分密钥也需要与您的第一个NSSortDescriptor匹配。