У меня есть UITableView, управляемый NSFetchedResultsController. Я вызываю метод для создания NSPredicate, который фильтрует мои объекты, которые имеют временную метку с сегодняшнего дня. И в моем NSFetchedResultsController я применяю предикат.
if (appDelegate.displayTodayOnly) {
[fetchRequest setPredicate:datePredicate];
}
Все это прекрасно работает. Однако иногда мне нужно просматривать записи, предшествующие «сегодня». Я делаю это, проводя вниз по табличному представлению, когда оно уже находится в начале таблицы.
-(void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (self.tableView.contentOffset.y<0) {
if (appDelegate.displayTodayOnly) {
[appDelegate setDisplayTodayOnly:NO];
NSInteger resultsOffset = [[self.fetchedResultsController fetchedObjects] count];
//[self.tableView beginUpdates];
[__fetchedResultsController release];
__fetchedResultsController=nil;
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
//[self.tableView endUpdates];
NSInteger fullCount = [[self.fetchedResultsController fetchedObjects] count];
if (fullCount>resultsOffset) {
NSUInteger sect = [[self.fetchedResultsController sections] count]-2;
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:sect];
NSUInteger rows = [sectionInfo numberOfObjects]-1;
NSIndexPath *indexing = [NSIndexPath indexPathForRow:rows inSection:sect];
NSLog(@"IndexPath = section:%d row:%d",sect,rows);
[self.tableView reloadData];
[self performSelector:@selector(scrollToIndexPath:) withObject:indexing afterDelay:0.0001];
}
}
}
}
Это тоже работает, но не элегантно. Он отбрасывает fetchedResultsController и перезагружает таблицу, начиная с записей с начала времени, насколько это касается записей. Затем он прокручивается до пути индекса над записью предыдущей таблицы.
Я хотел бы, чтобы записи загружались и вставлялись перед вершиной текущей таблицы. Кто-нибудь знает элегантный способ изменить выборку, чтобы это произошло?