2010-03-30 8 views
1

J'ai une table avec deux sections. Un contrôle segmenté dans les premières sections change les lignes affichées dans la deuxième section. Mon problème est que l'ordre des rangées et de quelle rangée sont affichées dans la deuxième section se décale incorrectement à chaque pression suivante d'un bouton dans le contrôle segmenté.iPhone: modifications de commande de cellule dans la section UITableView après appel à reloadSections: méthode

J'autorise un utilisateur à ajouter un produit à une liste d'achats de trois façons différentes: par nom, par code barre et en prenant une photo avec un appareil photo. J'ai 3 boutons dans un UISegmentedControl afin que les utilisateurs puissent choisir la méthode à utiliser. Selon le segment sélectionné par l'utilisateur, les champs du deuxième segment doivent être modifiés pour afficher les cellules pertinentes pour cette méthode.

Section 0: 
    0 row with segmented control showing name, barcode and camera buttons 
Section 1: 
    // button zero, name button 
    0 row with textfield 
    1 row with textfield 
or 
    // button 1, barcode button 
    0 row with textfield 
or 
    // button 2, camera button 
    // shows camera view 

J'ai placé des espaces réservés dans chaque UITextField.

Chaque fois que l'on clique sur un bouton dans le contrôle segmenté, j'appelle une méthode pickOne: qui met à jour le tablevew. Dans cette méthode, je construis un NSIndexSet avec NSRange de (1, 1), puis j'appelle la méthode reloadSections: du UITableViewController avec le NSIndexSet en tant que paramètre.

Lorsque la vue apparaît pour la première fois, tout va bien mais quand je clique plusieurs fois sur les boutons, l'ordre des cellules change. Les cellules contenant les deux textFields pour le button0 et les nouveaux lieuxHolders sont écrites sur les anciennes. Pire, parfois quand je clique sur le bouton 0, il ne me montre que la deuxième cellule des deux cellules.

Mon code détaillé peut être vu ici http://pastebin.com/9GwMpCS9

+0

Vous allez devoir montrer du code. Rappelez-vous, peu importe la description détaillée que vous donnez, vous pouvez gagner du temps en affichant le code approprié. – Jasarien

Répondre

0

Je vois quelques problèmes.

La première grande est que vous ajoutez des sous-vues dans les cellules en contournant le contentView. Les sous-vues dans des styles prédéfinis sont divisées en différentes parties en fonction de leurs rôles. Vous avez le contrôle d'édition, la vue de contenu et la vue accessoire. Bien que vous puissiez ajouter directement à la vue de la cellule, il y aura un comportement étrange car les cellules prédéfinies attendent que le contenu soit dans la vue de contenu.

Je pense que l'origine de votre problème est que vous ajoutez des sous-vues à chaque fois qu'une cellule est décorée mais que vous ne la supprimez jamais. Quand une cellule est retirée, il n'y a aucune garantie que tout est rétabli dans la nouvelle condition vierge comme si elle était allouée. Des choses comme des vues d'accessoires personnalisées qui ne sont pas supprimées peuvent être laissées pour compte. Je suis à peu près sûr que ça arrive. Vous collectez la corbeille visuelle sur les cellules qui doivent être propres.

+0

En fait, j'ai essayé à la fois de la vue de la cellule et son contentView, le résultat était le même, mais en réalité, il est préférable d'utiliser le contentView. Concernant le fait de réutiliser la cellule, vous avez raison. J'ai essayé de supprimer oldFields de superview chaque fois que je clique sur un bouton avant d'en ajouter de nouveaux, et cela fonctionne mieux. Le seul bug que j'ai est quand le code barre textField a le focus, et je clique sur le bouton 0. Dans ce cas, il montre seulement la deuxième cellule plutôt que d'afficher les deux cellules. J'ai résolu ce problème en démissionnant premier répondeur chaque fois que je clique sur un bouton. –

0

Je crois que votre problème est ici.

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    //.... 

     if(addMode == NAME) { 
      if(indexPath.row == 0) { 
       [cell addSubview:nameTextField]; 
      } 
      else if(indexPath.row == 1) { 
       [cell addSubview:categoryTextField]; 
      } 
     } 
     else if(addMode == BARCODE) { 
      [cell addSubview:barcodeTextField]; 
     } 
     else if(addMode == SCAN){ 

      //Scanning mode 
     } 
    } 
    return cell; 
} 

parce que le tableau a toujours avoir deux sections, cette méthode est toujours appelé à l'article 1. Quel que soit le type d'entrée sélectionné, il crée ou DEQUEUE une cellule et le renvoie. Chaque fois que addMode == SCAN, il supprime de façon aléatoire l'une des cellules précédemment utilisées pour le nom ou le code à barres addMode et renvoie cette valeur.

Je vous suggère de supprimer complètement la logique SCAN de la table ou de créer une rangée pour la caméra. Je pense que ce dernier est la meilleure interface utilisateur. Avec les deux premiers boutons, les utilisateurs sont présentés avec un choix dans la deuxième section. Vous devriez maintenir ce modèle avec le choix de la caméra. Ayez juste une cellule qui affiche un bouton qui évoque l'appareil photo. Oui, il ajoute une deuxième étape mais établit un modèle cinétique pour l'utilisateur: Sélectionnez le type d'entrée dans la première section puis sélectionnez une cellule appropriée dans la section deux.L'utilisateur ne devrait pas avoir à s'arrêter et penser à chaque fois s'il doit frapper l'une des lignes de la section deux ou non. Ils devraient juste le faire automatiquement.