1

UITableViewデータソースである配列内の各オブジェクトについて、特定のステートメントUITableViewを満たしている場合は削除しています。if私の問題は、配列から他のすべてのオブジェクトのみを削除することです。

コード:

UIImage *isCkDone = [UIImage imageNamed:@"UITableViewCellCheckmarkDone"];
int c = (tasks.count);
for (int i=0;i<c;++i) {
    NSIndexPath *tmpPath = [NSIndexPath indexPathForItem:i inSection:0];
    UITableViewCell * cell = [taskManager cellForRowAtIndexPath:tmpPath];
    if (cell.imageView.image == isCkDone) {
        [tasks removeObjectAtIndex:i];
        [taskManager deleteRowsAtIndexPaths:@[tmpPath]
                withRowAnimation:UITableViewRowAnimationLeft];
    }
}

これの何が問題なのですか?

4

2 に答える 2

6

ループを逆方向に実行する必要があります。つまり、

for (int i=c-1;i>=0;--i)

逆に実行している場合、インデックス位置のオブジェクトを削除するiと、配列内のi1 つ後ろの位置にあるオブジェクトが前方に移動します。最終的には、配列の境界を超えてしまうことさえあります。

于 2013-01-23T02:43:22.797 に答える
1

ループを順方向に実行し続けたい場合は、次のいずれかを実行できます。

あなたiの条件が満たされ、あなたがremoveObjectAtIndex

    if (cell.imageView.image == isCkDone) {
        ...
        --i ;
        ...
    }

または、条件が満たされない場合にi のみインクリメントします。

for ( int i=0 ; i<c ; ) {
    ...
    if (cell.imageView.image == isCkDone) {
        ...
    } else {
    ++i ;
    }
于 2013-01-23T02:49:50.513 に答える