Базовые данные: автоматически выбирать следующую строку таблицы при удалении записи - PullRequest
2 голосов
/ 27 августа 2011

Я работаю над приложением iPad, управляемым Core Data, с контроллером раздельного просмотра. Просто представьте себе приложение iPad Mail, и вы на правильном пути. Когда я выбираю запись в Root View Controller, детали отображаются в DetailViewController.

В подробном представлении у меня есть кнопка удаления. При щелчке он сообщает своему контексту базовых данных удалить текущий объект. Он выполняет удаление правильно, и строка исчезает из RootViewController, как и должно быть.

Как заставить RootViewController автоматически выбирать строку после строки, которая была удалена, чтобы впоследствии она отображала детали в подробном представлении? (Или автоматически выбрать предыдущую строку, если удаленная строка была последней строкой?)

Ответы [ 2 ]

0 голосов
/ 28 августа 2011

OK. Я думаю, что я понял это. Вот что я сделал. (Пожалуйста, включите, если вы видите лучший путь.)

Сначала я определил новый NSInteger ivar, lastSelectedRow.

Далее я изменил

   case NSFetchedResultsChangeDelete: {
       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
       break;

до

   case NSFetchedResultsChangeDelete: {
       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
       lastSelectedRow = indexPath.row;
       id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0];
       if (lastSelectedRow == [sectionInfo numberOfObjects]) {
           --lastSelectedRow;
       }
       break;
   }

Тогда я изменился

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}

до

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
    if (lastSelectedRow > -1) {
        NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:lastSelectedRow inSection:0];
        [self.tableView selectRowAtIndexPath:newIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
        [self tableView:self.tableView didSelectRowAtIndexPath:newIndexPath];
        lastSelectedRow = -1;
    }
}

Und вуаля !!

В качестве дополнительного бонуса теперь я могу сохранить последнюю выбранную строку после завершения работы моего приложения и вернуться к нему в следующий раз, когда оно запускается.

0 голосов
/ 27 августа 2011

Если вы используете NSFetchedResultsController для управления таблицей, вы можете использовать его методы делегата для реагирования на изменения.

Используйте метод делегата controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: и проверьте тип изменения NSFetchedResultsChangeDelete.

Вы можете увидеть, соответствует ли indexPath текущим выбранным строкам в вашей таблице, а затем действовать в соответствии с этим.

...