0

挿入コントロール (緑色のプラス アイコン) を介して行を挿入できるようにする UITableView があります。(元々、これはナビゲーション バーの [追加] コントロールで動作していましたが、[戻る]、[追加]、および [編集] コントロールでは、ナビゲーション バーが少し雑然としているように感じました)。

私はこれを機能させましたが、これが並べ替えコントロールと相互作用する方法が好きではありません。私のテーブルにはセクションが 1 つしかありません。挿入行は常にテーブルの最後の行として表示され、並べ替え可能ではありません。

挿入制御行に対して false を返す canMoveRowAtIndexPath: を実装しましたが、これは部分的な解決策にすぎません。これにより、挿入行をドラッグする機能が削除されました。ただし、ユーザーが可動行を選択して挿入コントローラー行の下にドラッグすることを妨げるものは何もありません。(許可されている場合、これによりアプリがクラッシュします)。

私が実装した回避策は、moveRowAtIndexPath:toIndexPath で to の場所を確認することです。移動先が挿入行の下にある場合、移動は実行せず、[tableView reloadData] を呼び出して前のテーブルの状態を再描画します。これは機能しますが、外観がぎこちなく、行が以前の位置に戻るだけで、理由は示されません。

これは正しい動作ですか?それとももっと洗練された解決策がありますか? 理想的には、そもそもユーザーが行を違法な場所にドラッグできないようにしたいのですが、それを防ぐメカニズムがあるかどうかはわかりません。

4

2 に答える 2

0

tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:デリゲートメソッドを実装する必要があります。実装は、行を目的の行にターゲティングできるかどうかに基づいて、適切なインデックスパスを返す必要があります。

于 2013-02-09T21:53:33.153 に答える
0

実装は次のとおりです。

// Don't allow dragging any moveable row below the insertion control
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:   (NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
    int proposedRow = proposedDestinationIndexPath.row;
    int maxRow = [[[SADeckStore sharedStore] allDecks] count] - 1;
    if (proposedRow < maxRow)
        return proposedDestinationIndexPath;
    else
        return [NSIndexPath indexPathForRow:maxRow inSection:[proposedDestinationIndexPath section]];
}
于 2013-02-10T19:16:52.370 に答える