2016-05-25 3 views
0

Если я нажимаю на ячейку и фона, то возникает обновление Core Data, моя ячейка становится недоступной.Как сохранить ячейку, выбранную при вызове NSFetchedResultsChangeMove с 2 идентичными NSIndexPath?

После расследования, реализация моих NSFetchedResultsControllerDelegate «х controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: вызывается с типом NSFetchedResultsChangeMove но indexPath и newIndexPath являются идентичным (то есть один и тем же значением строк/раздела).

Тип NSFetchedResultsChangeUpdate не вызывается.

Моя реализация controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: является типичной, предусмотренной в документации Apple. Я считаю, что переход от:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath { 

    ... 

    switch(type) { 

     ... 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 

к:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath { 

    ... 

    switch(type) { 

     ... 

     case NSFetchedResultsChangeMove: 
      if (indexPath.section != newIndexPath.section || indexPath.row != newIndexPath.row) { 
       [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
       [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      } 
      break; 
    } 
} 

бы решить мою проблему.

Мой вопрос: исправлено ли это или я пропустил что-то, что могло бы объяснить, почему мое обновление относится к типу NSFetchedResultsChangeMove?

ответ

0

Моя проблема была в том, что я был тем, что присваивал значения NSManagedObject экземплярам, ​​которые были такими же, как и раньше. то есть, если foo.bar равно 2, я бы назвал API и назвал новое назначение foo.bar = 2 на моем объекте. Несмотря на то, что значения были идентичными, Core Data по-прежнему рассматривала изменение стоимости.

По-прежнему странно, что у меня есть тип NSFetchedResultsChangeMove вместо типа NSFetchedResultsChangeUpdate, но heh.

Что я сделал, чтобы решить это:

if ([object.changedValues count] == 0) { 
    // Reverting changed on object 
    [context refreshObject:object mergeChanges:NO] 
} 

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