128 votes

Comment limiter la ligne UITableView réorganisation à une section

J'ai été frappé ma tête sur celui-ci, et google a été le tournant rien. Finalement, j'ai travaillé dessus et j'ai pensé l'écrire ici, pour le bien de la personne suivante.

Vous avez un UITableView avec plusieurs sections. Chaque section est homogène, mais le tableau d'ensemble est hétérogène. Donc, vous voudrez peut-être autoriser à modifier l'ordre des lignes dans une section, mais pas à travers les sections. Peut-être que vous ne voulez même voulez une section à être réorganisables à tous (c'était mon cas). Si vous êtes à la recherche, comme je l'ai été, à l' UITableViewDataSourceDelegate vous ne trouverez pas une notification quand il est sur le point de vous permettre de déplacer une ligne entre les sections. Vous obtenez un quand il commence à se déplacer d'une ligne (qui est très bien) et l'autre quand il est déjà déplacé et vous obtenez une chance pour synchroniser avec votre stuff. Pas utile.

Alors, comment pouvez-vous empêcher la ré-commandes entre les sections?

Je vais poster ce que j'ai fait comme une réponse distincte, en la laissant ouverte pour quelqu'un d'autre à poster une bien meilleure réponse!

183voto

Jason Harwig Points 9925

Cette implémentation n’empêchera réorganisation à l’extérieur de la section originale comme réponse de Phil, mais il se dégage également l’enregistrement de la première ou dernière ligne de la section, selon où la traînée est passé, au lieu où il a commencé.

78voto

philsquared Points 13547

Assez Simple, vraiment.

Le UITableViewDelegate a la méthode:


tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:

Ce qui est appelé lorsque l'utilisateur est assis sur un éventuel point de chute. Vous obtenez une chance de dire "non! ne le laisse pas tomber! Déposez ici à la place". Vous pouvez retourner un autre chemin d'index pour le projet.

Tous que j'ai fait était de vérifier si la section des indices de match. Si ils le font très bien, retourner la proposition de chemin. si pas, le retour de la source chemin. Ce aussi joliment empêche les lignes dans d'autres sections de déplacer hors de la voie lorsque vous faites glisser - et l'a traîné ligne reviennent à leur position d'origine vous essayez de le déplacer vers une autre section.


- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
    if( sourceIndexPath.section != proposedDestinationIndexPath.section )
    {
        return sourceIndexPath;
    }
    else
    {
        return proposedDestinationIndexPath;
    }
}

7voto

ASM11 Points 23

Vous pouvez empêcher la circulation des lignes entre la section à l’aide de méthode ci-dessous. Juste de ne pas laisser tout mouvement entre section. Vous pouvez même contrôler le mouvement d’une ligne spécifique dans une section. par exemple dernière ligne dans la Section.

Voici l’exemple :

3voto

N.V.BaoAnh Points 79

Que @Jason Harwig, le code ci-dessous fonctionne correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X