2016-05-25 3 views
0

セルをクリックし、背景のコアデータのリフレッシュが発生すると、セルの選択が解除されます。調査の後、2つの同一のNSIndexPathでNSFe​​tchedResultsChangeMoveが呼び出されたときに、セルを選択したままにする方法はありますか?

controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:の私NSFetchedResultsControllerDelegateの実装は、NSFetchedResultsChangeMoveのタイプと呼び出さなくindexPathnewIndexPath(すなわち同じ行/セクション値)同一です。

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は値が変更されたと考えていました。

NSFetchedResultsChangeUpdateタイプの代わりにNSFetchedResultsChangeMoveタイプがありましたが、まだ奇妙です。

私はこの問題を解決するためにやった

は次のとおりです。各更新の終わりに

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

ではなく、属性一つずつ比較します。

関連する問題