2012-07-30 4 views
2

J'ai une vue modifiable avec 50 lignes remplies à partir d'un nsarray prédéfini.UITableView multiselect

Comment puis-je sélectionner plusieurs lignes avec un maximum de 3 dire autorisé à la fois et vérifier show lors de la sélection et de décocher la case lorsque décochée/

Je suis vraiment nouveau à Xcode et toute aide est très appréciée. Je vous remercie.

Répondre

3

Vos données doivent garder une trace si elles sont sélectionnées ou non. Deux méthodes courantes sont les suivantes: chaque objet de votre tableau prédéfini possède un objet BOOL qui indique s'il est sélectionné ou non, ou vous conservez un second tableau contenant uniquement des références aux objets sélectionnés. Puisque vous êtes limité à trois sélectionnés, la deuxième option pourrait être meilleure.

Lorsque quelqu'un sélectionne une cellule dans votre tableau, vous modifiez le statut de sélection de l'objet associé, soit en changeant son BOOL, soit en l'ajoutant/en le supprimant dans le tableau supplémentaire. C'est aussi l'endroit pour vérifier si vous avez déjà autant de sélections que vous le permettez. Si les sélections ont changé, vous demandez à votre table de recharger les données.

Dans cellForRowAtIndexPath:, vous vérifiez si l'objet est sélectionné ou non et marquez-le en conséquence.

+0

Cette réponse est un meilleur style de codage. – Dustin

+0

D'accord, pouvez-vous s'il vous plaît expliquer avec un morceau de code comme un exemple? Cela me facilitera la compréhension. Merci –

+0

Il y a un exemple de projet disponible chez Apple qui en fait une version simple. Cherchez-en un appelé ListAdder dans la documentation. –

3
int counter = 0; //keep track of how many rows are selected 
int maxNum = 3; //Most cells allowed to be selected 

//Called when the user selects a row 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    //If the cell isn't checked and there aren't the maximum allowed selected yet 
    if (cell.accessoryType != UITableViewCellAccessoryCheckmark && counter < maxNum) 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     counter++; 
    } 
    else if (counter >= maxNum) return; //Don't do anything if the cell isn't checked and the maximum has been reached 
    else //If cell is checked and gets selected again, deselect it 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     counter--; 
    } 
} 

Vous pourriez aussi garder un tableau d'indices des cellules qui sont sélectionnées, si vous voulez faire quelque chose avec les données qui sont en eux. Si vous ne savez pas comment faire cela, faites le moi savoir et je vais ajouter le code.

Notes:

  • Vous devez être mise en œuvre de la vue du tableau de protocole délégué afin d'avoir cette méthode appelée correctement.
  • Ce n'est pas la "meilleure" façon de le faire (utiliser le contenu des cellules pour garder une trace de la sélection est généralement désapprouvée), mais c'est très facile.
  • Vous pourriez rencontrer des problèmes de réutilisation des cellules. Si vous voulez corriger cela, stocker l'index de la cellule et définir le type d'accessoire cellForRowAtIndexPath
+0

Problème mineur: vous devez d'abord aller chercher la cellule. Plus gros problème: je suppose que cela donnerait des résultats incohérents si les cellules sont mises en cache et que l'utilisateur défile. –

+0

Vous avez raison, je me suis rendu compte que dès que j'ai posté la réponse et édité légèrement pour tenir compte du comportement. J'essayais juste de trouver l'approche la plus simple/la moins codante et j'ai supposé que les cellules n'étaient pas réutilisées. OP est nouveau sur XCode donc je ne voulais pas le confondre. – Dustin

+0

Merci. Le problème qui est décrit dans le commentaire, comment puis-je résoudre ce problème? Ou la troisième note que vous avez écrite suggère une manière différente, pouvez-vous s'il vous plaît expliquer cela avec un code pour m'aider à mieux comprendre? Je vous remercie. –