Обзор:IOS - основные данные - таблица вид прокрутки добавляемого записи
Я проектом IOS с использованием следующих:
- основных данных (с использованием
NSFetchedResultsController
) - , отображающей данные в виде таблицы (
UITableView
)
Что я хочу сделать:
- Когда пользователь добавляет запись, я хочу перейти к вновь добавленной записи.
То, что я сделал
- При добавлении новой записи, Внутри метода
NSFetchedResultsControllerDelegate
, я храню путь индекса в свойствеlastAddedIndexPath
, когда тип вставки/обновления/переместить - После вызова сохранения, я прокручиваю в "lastAddedIndexPath"
кодекса (NSFetchedResultsControllerDel Egate)
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext)
{
switch(type)
{
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
NSLog(@"going to store insert - scroll");
self.lastAddedIndexPath = newIndexPath;
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
NSLog(@"going to store update - scroll");
self.lastAddedIndexPath = newIndexPath;
break;
case NSFetchedResultsChangeMove:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
NSLog(@"going to store move - scroll");
self.lastAddedIndexPath = newIndexPath;
break;
}
}
}
Код для прокрутки
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
if (self.beganUpdates) //already [self.tableView beginUpdates] invoked
{
[self scrollToLastAddedIndexPath]; //contains the logic to scroll
[self.tableView endUpdates];
}
}
Проблема
- Я думаю, что эта запись будет добавлена в виде таблицы асинхронно в другом потоке.
- поэтому даже после сохранения базы данных, когда я прокручиваю до
lastAddedIndexPath
, запись в таблице еще не существует.
Вопросы
- Как бы я быть в состоянии перейти к вновь добавленным пути записи после того, как запись была добавлена в виде таблицы?
- Должен ли я использовать уведомления, чтобы знать, когда база данных будет сохранена?
- Есть ли другой альтернативный подход?
Где находится ваш [self.tableView endUpdates] вызов? Вы хотите, чтобы свиток произошел сразу после этого. – jrturton
Я выполняю прокрутку внутри контроллераDidChangeContent: я повторно задал вопрос, чтобы показать код. – user1046037
Итак, что произойдет, если вы переключите свиток и концы обновлений? – jrturton