Не уверен, что я полностью понимаю ваш вопрос, но я делаю что-то подобное в своем приложении, и вот как я заставляю его работать:
Во-первых, метод fetchedResultsController, где я устанавливаю описания сортировки и предикаты на основена то, что я пытаюсь сделать.В этом случае я хочу отсортировать названия фильмов по дате выпуска, ТО по названию.Затем с моим предикатом я беру сущности определенного «типа» и в пределах определенного диапазона «releaseDate».
В моем определении fetchresultscontroller вы устанавливаете sectionNameKeyPath на «releaseDate», поэтому мои заголовки разделов будут основываться наdate.
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController_ != nil) {
return fetchedResultsController_;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSSortDescriptor *sortByReleaseDate = [[NSSortDescriptor alloc] initWithKey:@"releaseDate" ascending:NO];
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByReleaseDate,sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortByName release];
[sortByReleaseDate release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(type == 'Movies') AND (releaseDate <= %@) AND (releaseDate >= %@)", [NSDate date], [NSDate dateWithTimeIntervalSinceNow:kOneDayTimeInterval*-30]];
[fetchRequest setPredicate:predicate];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Movie" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"releaseDate" cacheName:nil];
...// Perform and return fetch here, error handling etc...
return fetchedResultsController_;
}
Затем в моем табличном представлении методы делегата источника данных я возвращаю фактический заголовок для каждого заголовка после преобразования моего NSDate в NSString (помните, что вы должны вернуть NSString для заголовка заголовка таблицы.
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString *rawDateStr = [[[self.fetchedResultsController sections] objectAtIndex:section] name];
//convert default date string to NSDate...
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"];
NSDate *date = [formatter dateFromString:rawDateStr];
//convert NSDate to format we want...
[formatter setDateFormat:@"d MMMM yyyy"];
NSString *formattedDateStr = [formatter stringFromDate:date];
return formattedDateStr;
}
Так что, если бы я хотел изменить способ отображения моих данных, например, по названию titleName, я бы изменил свой объект fetchedResultsController на:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleName" cacheName:nil];
И изменил бы свое табличное представление: titleForHeaderInSection: метод источника данных для простого возврата titleName (которое уже является строкой):
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [[[self.fetchedResultsController sections] objectAtIndex:section] name];
}
Надеюсь, это поможет вам найти решение вашей конкретной проблемы.
Cheers, Rog