Question

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

J'ai essayé de remplacer -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 non sélectionné en raison de la sélection d’une autre cellule!

J'espère que quelqu'un pourra vous aider!

Merci,

Nick.

Était-ce utile?

La solution

La meilleure façon de le faire serait de cocher la case sélectionnée.

Vous pouvez le faire en définissant le type d'accessoire des 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 de la table à la recherche de UITableViewCellAccessoryCheckmark. Vous pouvez également gérer un ensemble NSSet ou similaire dans votre délégué de vue tableau dans l'option "Avez sélectionné". méthodes déléguées.

Autres conseils

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

self.tableView.allowsMultipleSelection = YES;

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

    - (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;
}

Jeff Lamarche a un tutoriel sur la procédure à suivre ici:

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

Je n'ai pas encore essayé le code, mais cela fait un moment que je suis conscient du fait que le jour viendra où j'en aurai besoin.

J'ai rétroporté allowMultipleSelectionDuringEditing et allowMultipleSelection d'iOS5 à un ancien iOS. Vous pouvez y accéder à la https://github.com/ud7/UDTableView-allowsMultipleSelection

Son remplacement est peu répandu et la seule chose à faire est de changer UITableView en UDTableView (dans le générateur de code ou d'interface)

À partir du HIG:

  

Les vues 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 tableau n’affichent pas   état sélectionné persistant.

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

Les gars pour la sélection multiple dont vous avez 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;
}

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 toute 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 les lignes sélectionnées.

La ligne bleue en surbrillance en tant qu'indicateur permettant d'indiquer si une ligne est sélectionnée est réellement déconseillée, selon le 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;
    }

}

ajoutez ensuite votre tableau ou la manière dont vous souhaitez stocker les données sélectionnées.

Je cherchais le même problème et la réponse de Bhavin Chitroda l’a résolu, mais avec quelques ajouts pour que la case à cocher ne soit pas cochée 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'ajout:

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

    return cell;

}

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

Si vous ne prévoyez 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
}

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top