2012-04-18 1 views
2

Обзор:IOS - основные данные - таблица вид прокрутки добавляемого записи

Я проектом IOS с использованием следующих:

  • основных данных (с использованием NSFetchedResultsController)
  • , отображающей данные в виде таблицы (UITableView)

Что я хочу сделать:

  • Когда пользователь добавляет запись, я хочу перейти к вновь добавленной записи.

То, что я сделал

  1. При добавлении новой записи, Внутри метода NSFetchedResultsControllerDelegate, я храню путь индекса в свойстве lastAddedIndexPath, когда тип вставки/обновления/переместить
  2. После вызова сохранения, я прокручиваю в "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, запись в таблице еще не существует.

Вопросы

  1. Как бы я быть в состоянии перейти к вновь добавленным пути записи после того, как запись была добавлена ​​в виде таблицы?
  2. Должен ли я использовать уведомления, чтобы знать, когда база данных будет сохранена?
  3. Есть ли другой альтернативный подход?
+0

Где находится ваш [self.tableView endUpdates] вызов? Вы хотите, чтобы свиток произошел сразу после этого. – jrturton

+0

Я выполняю прокрутку внутри контроллераDidChangeContent: я повторно задал вопрос, чтобы показать код. – user1046037

+1

Итак, что произойдет, если вы переключите свиток и концы обновлений? – jrturton

ответ

5

Ваша прокрутка должна произойти после [self.tableView endUpdates], так как новая строка не добавляется к таблице до этой точки. Поэтому переключите два утверждения вокруг:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    if (self.beganUpdates) //already [self.tableView beginUpdates] invoked 
    { 
     [self.tableView endUpdates]; 
     [self scrollToLastAddedIndexPath]; //contains the logic to scroll 

    } 
} 
+0

еще раз спасибо !!!! – user1046037

1

Вы должны выполнять прокрутку:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 

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

+0

Спасибо, я выполняю прокрутку внутри контроллераDidChangeContent: но dosen't, похоже, работает. повторили вопрос, чтобы показать код. Позвольте мне попробовать KVO. – user1046037

0

В моем сценарии мне нужно показать последний добавленный объект поверх представления таблицы, поэтому я использовал другой подход, я использовал NSSortDescriptor для сортировки массива, а затем повторно загружал представление таблицы каждый раз, когда он добавлял/удалял любую запись. как этот

NSSortDescriptor * sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]autorelease]; 
NSArray * sortDescriptorArray = [[[NSArray alloc] initWithObjects:sortDescriptor,nil]autorelease]; 

self.commitsList = [[self.listItem.itemCommit allObjects] sortedArrayUsingDescriptors:sortDescriptorArray]; 

[tblView reloadData]; 

И тогда вы можете использовать любой ключ, связанный с вашими данными в initWithKey и отсортировать массив, чтобы решить эту. А в CellForRowIndex методе табличного вида вы можете использовать этот массив для заполнения tableview.

+0

спасибо Шахиду, но в моем случае я сортирую его на основе другого поля, и я не могу изменить порядок сортировки, поэтому хочу просто прокрутить эту запись. – user1046037

+0

Вы можете использовать этот метод scrollToRowAtIndexPath: atScrollPosition: анимированный: –

+0

и сортируйте перед тем, что вы обычно делаете. он укажет на строку, которую вы добавили недавно. –

Смежные вопросы