0

私はobjective-cにかなり慣れておらず、プログラミングの経験もあるので、私の問題は次のとおりです。

使ってます

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
    toIndexPath:(NSIndexPath *)toIndexPath

{

    NSString *item = [test objectAtIndex:[fromIndexPath row]];

    [test removeObject:item];

    [test insertObject:item atIndex:[toIndexPath row]];

}

編集スタイルで行を移動できるようにします。テスト配列内のオブジェクトが一意の場合、すべてが正常に機能します。ただし、2つ以上のオブジェクトが同じ場合、アプリはクラッシュします。たとえば、配列内の文字列が次の場合:@ " BOB "、@" LINDA "、" JOHN "、私は行をうまく動かすことができます。しかし、文字列が次の場合:@" BOB "、@" LINDA "、@" JOHN "、@" BOB "、" @ BOB 「アプリがクラッシュします

次の原因で:

*キャッチされなかった例外'NSRangeException'が原因でアプリを終了しています、理由:'-[__ NSCFArray insertObject:atIndex:]:インデックス(2)が境界を超えています(1) '

手伝ってくれませんか?ありがとうございました。

4

2 に答える 2

0

使用するときはinsertObject:atIndex:、オブジェクトを挿入するためのインデックスが以下であることを確認する必要があり[array count]ます。それ以外の場合は、使用する必要があります[array addObject:item]

次のようなものを試してください:

NSString *item = [test objectAtIndex:[fromIndexPath row]];
[test removeObject:item];
if ([toIndexPath row] < [test count]) {
    [test insertObject:item atIndex:[toIndexPath row]];
}
else {
    [test addObject:item];
}
于 2013-02-22T15:26:00.017 に答える
0

同じ文字を含む文字列のアドレスは同じ (定数ポインター) である必要があるため、1 つの項目 @"BOB" ​​を削除すると、その中に別の文字列 @"BOB" ​​があれば、おそらく両方の項目を配列から削除します。

removeObjectAtIndexオブジェクト関連の remove 関数よりもこの関数を使用し、必要に応じてインデックス パスへの挿入を -1 で調整します (インデックスへのパスがインデックス パスからのパスの後ろにある場合)。

:

小さなテストを行ったところ、実際に @"BOB" ​​を配列から 2 回この文字列で削除すると、両方の文字列が削除されます。

于 2013-02-22T15:39:35.580 に答える