iOS 5.0 以降をターゲットにできる場合は、 を使用しNSOrderedSet
てオブジェクトの順序を維持できます。この方法を使用すると、以下で提案する他の方法よりも効率が大幅に低下することに注意してください (Apple のドキュメントによると)。詳細については、iOS 5 のコア データ リリース ノートを確認してください。
5.0 より前のバージョンの iOS をサポートする必要がある場合、またはより効率的な方法を使用したい場合は、エンティティに追加の整数属性を作成し、エンティティのオブジェクトが追加または再配置されているときに、エンティティのオブジェクトのインデックスを手動で維持する必要があります。オブジェクトを表示するときは、この新しい属性に基づいてオブジェクトを並べ替える必要があります。これで準備は完了です。たとえば、moveRowAtIndexPath
メソッドは次のようになります。
- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath sortProperty:(NSString*)sortProperty
{
NSMutableArray *allFRCObjects = [[self.fetchedResultsController fetchedObjects] mutableCopy];
NSManagedObject *sourceObject = [self.fetchedResultsController objectAtIndexPath:sourceIndexPath];
// Remove the object we're moving from the array.
[allFRCObjects removeObject:sourceObject];
// Now re-insert it at the destination.
[allFRCObjects insertObject:sourceObject atIndex:[destinationIndexPath row]];
// Now update all the orderAttribute values for all objects
// (this could be much more optimized, but I left it like this for simplicity)
int i = 0;
for (NSManagedObject *mo in allFRCObjects)
{
// orderAttribute is the integer attribute where you store the order
[mo setValue:[NSNumber numberWithInt:i++] forKey:@"orderAttribute"];
}
}
最後に、手作業が多すぎると感じた場合は、無料のSensible TableViewフレームワークを使用することを強くお勧めします。フレームワークは、順序を自動的に維持するだけでなく、エンティティの属性と他のエンティティとの関係に基づいてすべてのテーブル ビュー セルを生成します。私の意見では、間違いなく大きな時間の節約になります。UIOrderedTableViewという別のライブラリも知っていますが、自分で使用したことがないため、お勧めできません (以前のフレームワークもはるかに人気があります)。