web-dev-qa-db-fra.com

Est-il possible de configurer un UITableView pour permettre la sélection multiple?

Pour l'iPhone, est-il possible de configurer un UITableView de manière à permettre la sélection multiple?

J'ai essayé de surcharger -setSelected:animated: pour chaque UITableViewCell, mais essayer de modifier le comportement requis est délicat, car il est difficile de séparer les désélection réelles de celles pour lesquelles UITableView pense que j'ai désélectionné en raison de la sélection d'une autre cellule!

J'espère que quelqu'un peut aider!

Merci,

Entaille.

40
Nick Cartwright

La meilleure façon de procéder consiste à cocher chaque ligne sélectionnée.

Vous pouvez le faire en définissant l'accessoireType sur les instances UITableViewCell sélectionnées sur UITableViewCelAccessoryCheckmark.

Pour désélectionner la ligne, rétablissez-la sur UITableViewCellAccessoryNone.

Pour énumérer les cellules/lignes sélectionnées (par exemple, en cliquant sur un bouton), parcourez simplement les cellules du tableau à la recherche de UITableViewCellAccessoryCheckmark. Ou encore, gérez un NSSet ou un élément similaire dans votre délégué de vue tableau dans les méthodes de délégation "Avez sélectionné".

36
z8000

La propriété suivante devrait fonctionner correctement si vous développez une application pour iOS5.0 +

self.tableView.allowsMultipleSelection = YES;
39
Hamdi

Utilisez le code suivant pour configurer les types d’accessoires de cellules:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];


    if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
        thisCell.accessoryType = UITableViewCellAccessoryCheckmark;

    }else{
        thisCell.accessoryType = UITableViewCellAccessoryNone;

    }
}

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {

//add your own code to set the cell accesory type.
return UITableViewCellAccessoryNone;
}
25
Benjamin Ortuzar

Jeff Lamarche a un tutoriel sur la façon de faire ceci ici:

http://iphonedevelopment.blogspot.com/2008/10/table-view-multi-row-edit-mode.html

Je n'ai pas essayé le code, mais cela me trotte dans la tête depuis un moment, sachant que le jour viendra où j'en aurai besoin.

24
oldbeamer

J'ai rétroporté allowsMultipleSelectionDuringEditing et allowsMultipleSelection d'iOS5 vers un ancien iOS. Vous pouvez le bifurquer à https://github.com/ud7/UDTableView-allowsMultipleSelection

C'est une solution de remplacement et la seule chose à faire est de changer UITableView en UDTableView (dans le générateur de code ou d'interface).

11
RolandasR

Du HIG: 

Les vues sous forme de tableau fournissent des informations lorsque les utilisateurs sélectionnent des éléments de la liste. Plus précisément, lorsqu'un élément peut être sélectionné, le La ligne contenant l'élément est brièvement mise en surbrillance lorsqu'un utilisateur le sélectionne pour indiquer que la sélection a été reçue. Ensuite, une action immédiate se produit: une nouvelle vue est révélée ou la ligne affiche une coche pour indiquer que l'élément a été sélectionné. La ligne ne reste jamais en surbrillance, car les vues de table n’ont pas d’affichage état sélectionné persistant. 

Vous devrez créer votre propre style de sélection multiple, avec quelque chose comme Mail, ou en utilisant l'accessoire à cocher sur vos cellules.

5
Ben Gottlieb

Les gars pour la sélection multiple dont vous avez juste besoin

self.tableView.allowsMultipleSelection = YES;

sur viewDidLoad et

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = NO; 
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = YES;
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryNone;
}
5
Raphael Oliveira

la ligne bleue en surbrillance en tant qu'indicateur indiquant si une ligne est sélectionnée est réellement déconseillée conformément au HIG page 121. Les coches feront l'affaire.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    int selectedRow = indexPath.row;
    cout << "selected Row: " << selectedRow << endl;
    UITableViewCell *indexPathForCell = [tableView cellForRowAtIndexPath:indexPath];
    if (indexPathForCell.accessoryType == UITableViewCellAccessoryNone) {
        indexPathForCell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        indexPathForCell.accessoryType = UITableViewCellAccessoryNone;
    }

}

puis ajoutez votre tableau ou quelle que soit la manière dont vous souhaitez stocker les données sélectionnées.

2
John Riselvato

Si vous essayez de faire quelque chose comme la sélection multiple de Mail (pour supprimer du courrier, par exemple), vous devrez probablement gérer vous-même la sélection. La sélection de plusieurs rangées n'est pas la norme sur l'iPhone. Mail résout ce problème en utilisant des coches pour indiquer quelles lignes ont été sélectionnées.

2
August

Je cherchais le même problème et la réponse de Bhavin Chitroda l’a corrigée pour moi, mais avec quelques ajouts pour garder la case à cocher comme elle était lors du défilement.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        if ( [array indexOfObject:indexPath] == NSNotFound ) {
            [array addObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            [array removeObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }

}

L'addition:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// Your code here
.
.
.
    if ( [array indexOfObject:indexPath] == NSNotFound ) {
        cell.accessoryType = UITableViewCellAccessoryNone;
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    return cell;

}
2
Omar Elgendy

Remarque: Cela ne fonctionne pas sous iOS 4+. Ceci est une constante privée et non documentée. Ne l'utilise pas.

Si vous n'envisagez pas de soumettre votre application sur l'App Store, vous pouvez appeler le mode d'édition sur plusieurs lignes en implémentant la méthode suivante dans votre délégué UITableViewController:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 3; // Undocumented constant
}
1
titaniumdecoy

Testé avec iOS4.3 - 6.0

-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {

    if ([controller.searchResultsTableView respondsToSelector:@selector(allowsMultipleSelectionDuringEditing)]) {
        controller.searchResultsTableView.allowsMultipleSelectionDuringEditing = YES;
    }
    else {
        controller.searchResultsTableView.allowsSelectionDuringEditing = YES;
    }
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellAccessoryCheckmark;
}
0
Adriana