1

次のようなコードスニペットがあります。

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[array indexOfObject:[array objectAtIndex:indexPath.row]]] withRowAnimation:UITableViewRowAnimationLeft];
[tableView endUpdates];
[tableView reloadData];

ユーザーがアクセサリをクリックすると実行されます。最初の部分はスムーズなアニメーションを提供するためだけにあり、tableViewは数ミリ秒後にリロードされるため、実際には重要ではありませんが、前述したように、アニメーションを提供するためにあります。

選択したオブジェクトを現在のindexPathから同じindexPathの配列の値に移動することになっています。

明らかに、このコードは機能しないので、それを修正するために何ができるか知りたいだけですか?

PS:コンパイル時にも警告が表示されます。通常の「'arrayWithObject:'の引数1を渡すと、キャストなしで整数からポインタが作成されます...」(3行目)

このスニペットで終わりました:

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:[array indexOfObject:[arraySubFarts objectAtIndex:indexPath.row]] inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

[tableView reloadData];
4

2 に答える 2

1

NSIndexPathクラス拡張メソッドを使用して+indexPathForRow:inSection:、行をインデックス パスに変換できます。詳細はこちら

行を削除して挿入する唯一の目的がアニメーションを発生させることである場合、そのreloadRowsAtIndexPaths:withRowAnimation:方法を検討しましたか?

于 2010-04-30T20:41:02.817 に答える
1
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[array indexOfObject:[array objectAtIndex:indexPath.row]]] withRowAnimation:UITableViewRowAnimationLeft];

この行を分割すると、次のようになります。

NSObject *obj = [array objectAtIndex:indexPath.row];
int *index = [array indexOfObject:obj];
NSArray *otherArray = [NSArray arrayWithObject:index];
[tableView insertRowsAtIndexPaths:otherArray withRowAnimation:UITableViewRowAnimationLeft];

おそらくあなたが望むのは:

NSObject *obj = [array objectAtIndex:indexPath.row];
NSIndexPath *index = [NSIndexPath indexPathForRow:[array indexOfObject:obj] inSection:0];
NSArray *otherArray = [NSArray arrayWithObject:index];
[tableView insertRowsAtIndexPaths:otherArray withRowAnimation:UITableViewRowAnimationLeft];

しかし、なぜあなたはこれを行うことができないのですか?

NSArray *otherArray = [NSArray arrayWithObject:indexPath];
[tableView insertRowsAtIndexPaths:otherArray withRowAnimation:UITableViewRowAnimationLeft];

インデックスを使用して配列からオブジェクトを取得し、オブジェクトを使用してインデックスを見つけるのは冗長に思えます。インデックスを使用するだけです。


さらにコードを編集します。

NSNumber *obj = [NSNumber numberWithInt:indexPath.row];
int *index = [array indexOfObject:obj];
NSIndexPath *index = [NSIndexPath indexPathForRow:index inSection:0];
NSArray *otherArray = [NSArray arrayWithObject:index];
[tableView insertRowsAtIndexPaths:otherArray withRowAnimation:UITableViewRowAnimationLeft];
于 2010-04-30T20:50:20.033 に答える