9

TableViewにCoreDataを入力しています。

今まで私はこのようなことをしていました:

        NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];

...行を埋めるためにオブジェクトを取得します。

最初の行にはCoreDataによって提供されていない他のコンテンツが含まれるため、例外としてテーブルの最初の行を管理する必要があることに気付くまで、すべてが正常に機能していました。

今私の問題は、indexPathを操作してすべてを1つシフトする方法です。私はこのようなことをしたいと思います:

// I know this is not going to work, just to give you an idea...
   NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath-1];

しかし、indexPathを操作するための正しい構文が見つかりません。誰か助けてもらえますか?あなたの時間のためのThx!

4

2 に答える 2

13

iOSのインデックスパスについて話している場合、UITableViewはるかに簡単な方法があります。

NSIndexPath* newIndexPath = [NSIndexPath indexPathForRow:oldIndexPath.row+1 inSection:oldIndexPath.section];

乾杯... :)

于 2011-11-22T19:44:58.983 に答える
2

標準のiOSUITableViewについて話している場合、インデックスパスはNSIndexPathのインスタンスであり、セクションインデックスとインデックスの2つのエントリがあります。私があなたの言うことを正しく理解しているなら、あなたはテーブルビューのセルを埋めるために行くたびにインデックスを1ずつ減らしたいと思うでしょう。(セクションが1つしかない、またはセクションインデックスを気にしないと仮定します。これが間違っている場合は、質問を編集してください。)

基本的には、調整されたインデックスを使用して新しいNSIndexPathインスタンスを作成し、それを使用してフェッチされた結果コントローラーにクエリを実行する必要があります。このようなものは機能します(テストされていません):

NSUInteger indexes[2];
[indexPath getIndexes:indexes];
indexes[1]--;
NSIndexPath * adjustedIndexPath = [[NSIndexPath alloc] initWithIndexes:indexes
                                                                length:2];
NSManagedObject * managedObject = [self.fetchedResultsController
                                    objectAtIndexPath:adjustedIndexPath];

これは基本的に次のことを行います。

  1. 既存のインデックスをNSUIntegerのC配列にプルします
  2. 最後のインデックス(位置1-行インデックス)を1つ減らします
  3. C配列から調整されたインデックスを使用して新しいNSIndexPathを作成します
  4. 新しいインデックスパスを使用して管理対象オブジェクトをフェッチします

これはセクションインデックスにはまったく影響しないため、最初のセクションにあるかどうかに関係なく、テーブル内のすべてのセルを調整することに注意してください。それが望ましくない場合は、調整を条件付き(たとえばif([indexPath indexAtPosition:0] == 0))でラップするか、独自のカスタムロジックを追加します。

于 2011-11-22T19:13:27.230 に答える