2

この質問が以前に尋ねられたことは知っていますが、Core Data プロジェクトで UITableView セルを使用して並べ替えを実装する方法についてはまだ混乱しています。セルを再配置した後、コア データには影響しません。

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
      toIndexPath:(NSIndexPath *)toIndexPath
{
 NSInteger sourceRow = fromIndexPath.row;
        NSInteger destRow = toIndexPath.row;
        Question *cat1=[questionsArray objectAtIndex:sourceRow];
        [questionsArray removeObjectAtIndex:sourceRow];
        [questionsArray insertObject:cat1 atIndex:destRow];
        [self.cardsTable setEditing:NO animated: YES];
        [cardsTable reloadData];
}
4

2 に答える 2

3

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という別のライブラリも知っていますが、自分で使用したことがないため、お勧めできません (以前のフレームワークもはるかに人気があります)。

于 2013-03-26T07:29:14.270 に答える
0

まず、インデックスを NSManagedObject に保持する必要があります。

新しいオブジェクトを挿入するときは、必ずインデックスを lastIndex+1 に設定してください

オブジェクトをフェッチした後、インデックスで並べ替えます。

セルを並べ替えるときは、インデックスをオブジェクトに設定する必要もあります。すべてのオブジェクトのインデックスを変更する必要がある場合があるため、注意してください。

例: 最初のセルを取得して、最後の位置に移動します。この場合、すべてのインデックスが変更されます。FirstCell は最後のインデックスを取り、他のすべては oldIndex-1 を取ります。

編集が完了したら、データ ソース配列の反復処理を行い、オブジェクト インデックスを反復インデックスに設定することをお勧めします。

于 2013-03-26T07:23:29.457 に答える