1

私は現在UIコンポーネントに取り組んでおり、UITableViewと同様に動作するため、UITableViewのデリゲートプロトコルとデータソースプロトコルを大幅にモデル化しています。しかし、私はよく理解していない1つのメソッドに気づきました-'canMoveRowAtIndexPath'。

これにより、デリゲートは基本的に、指定されたセルを「移動可能」にするかどうかを指定できます。ただし、別の可動セルを不動セルよりも高いインデックス(つまり、テーブルの「上」)にドロップすると、とにかく間接的に移動しませんか?(移動したセルの下にあるすべてのセルが1行下にプッシュされるため)。

だから基本的に、私の質問はこの方法のポイントは何ですか?誰かがそのユースケースの例を提供できますか?わざわざコンポーネントに含めるべきかどうかを議論しているからです。

どちらかといえば、おそらくもっと便利なデリゲートメソッドは'canMoveRowInSection'のようなものだと思います。これにより、特定のセクションの行を移動できるかどうかを指定できます。これにより、特定のセクションの並べ替えを無効にすることができ、そのセクションの外に他の行を移動しても、そのセクション内の行の順序には影響しません。

Appleのエンジニアがこの方法を提供したのには理由がありますが、その理由が何であるかわかりません。

洞察をありがとう!

4

1 に答える 1

4

canMoveRowAtIndexPathテーブルが編集モードの場合、セル(または特に選択した場合はセル)を上下に移動できることをUITableViewに通知します。

その動きの反対側を処理するのは開発者次第です。

たとえば、「A」、「B」、「C」の配列NSMutableArray正確には)があり、その配列を「B」、「C」、「A」に再配置するとします。移動するセルの場所に基づいて配列に変更を加え、その配列を保存する必要があります。

-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    id objectToMove = [[array objectAtIndex:fromIndexPath.row] retain];
    [array removeObjectAtIndex:fromIndexPath.row];
    [array insertObject:objectToMove atIndex:toIndexPath.row];
    [objectToMove release];
}

セクションの例

この例では、テーブルセクションが0の場合、セルは移動できません。他のセクション(3つあるとしましょう)、セクション1と2のセルは移動できます。それでも、それに応じて配列を処理する必要があります。

-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if ( indexPath.section == 0 )
        return NO;

    return YES;
}
于 2012-06-04T19:39:46.473 に答える