2010-02-25 5 views
0

J'ai rencontré un peu de problème. Habituellement, quand je traite avec UITableView, je vais construire une méthode spéciale , configureCell, qui construit les cellules comme tableView en a besoin. Ainsi cellForRowAtIndexPath interroge le configureCell pour obtenir une nouvelle cellule si aucun n'est trouvé dans le cache.UITableView avec une seule cellule personnalisée? (iPhone)

Dans la partie de cellForRowAtIndexPath qui obtient exécuté chaque fois qu'un utilisateur fait défiler:

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
     static NSString *CellIdentifier = @"Cell"; 

     UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) {  
      cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
      [self configureCell:cell atIndexPath:indexPath]; 
     } 
//this part is always executed! 
} 

I définir les valeurs d'étiquettes etc., de mon modèle. Cela fonctionne bien et je crois que c'est ce qui devrait fonctionner correctement et être le moins contraignant pour le processeur. D'après ce que je peux lire dans le Guide TableView.

Mon problème est maintenant que la première cellule de ma tableView est différente des autres. J'ai une icône spéciale et d'autres choses qui la sépare des autres cellules.

Dans ma cellule de configuration je puis essayé de demander:

if (indexPath.row == 0) { 

    //do special setup! 

} 

Ceci est une mauvaise idée que les charges paresseux tableView les cellules et donc la première cellule qui est hors de l'écran, lorsqu'il est défilée à l'écran, obtiendra également indexPath.row = 0 alors maintenant j'ai une "cellule spéciale" pour chaque 7 cellules. Comment contourner celui-ci?

Un deuxième problème qui provient également de ce qui précède: J'ai un UIView personnalisé placé dans toutes les cellules accessoryView. Lorsque l'utilisateur appuie sur un bouton "Modifier", tous les accessoires des cellules doivent être remplacés par une icône indiquant que nous sommes en "mode édition". Ici encore, cela ne se produit que pour les cellules à l'écran, lorsque le défilement de cellules "anciennes" est extrait du cache ou que de nouvelles cellules sont créées qui ne savent pas que nous sommes en mode édition.

Lorsque vous appuyez sur une cellule, il n'y a aucun doute sur le indexPath.row de la cellule engagée, cet index que vous devez appaire avec votre tableau de modèles pour comprendre ce que l'utilisateur a tapé. Mais il semble que des règles différentes s'appliquent lorsque TableView manipule les cellules (en les tirant à l'écran, hors écran, en les effaçant, en les ajoutant).

Je suppose, je demande; pour suivre les meilleures pratiques et ne pas combattre le SDK, que dois-je faire pour obtenir la fonctionnalité désirée et à quel stade du cycle de vie de la Cellule dois-je appliquer cette logique?

quelqu'un L'espoir peut me guider dans la bonne direction :) merci d'avance :) Vous

+0

Quel style de TableViewController utilisez-vous? –

+0

Ahh n'a pas vu ta question là Rob. C'est un UITableView que j'ai manuellement ajouté à un UIViewController. Il n'utilise pas de sections. comme ceci: self.tableView = [[[UITableView alloc] initWithFrame: self.view.bounds] autorelease]; Est-ce que cela répond à votre question? – RickiG

+0

Juste changé pour: \t self.tableView = [[[UITableView alloc] initWithFrame: style self.view.bounds: UITableViewStylePlain] autorelease]; Pour être sûr :) – RickiG

Répondre

1

Je pense que le problème n'est pas que la première cellule hors écran est à indexPath.row = 0. Le problème est que vous utilisez le même CellIdentifier pour les cellules régulières et personnalisées. Ainsi, lorsque TableView va déqueue une cellule mise en cache, elle saisit parfois votre cellule personnalisée qui contient l'icône.

Puisque vous lui avez donné le même identifiant CellIdentifier que vos cellules normales, il ne sait pas qu'elles ne sont pas identiques.

Quelque chose comme cela devrait corriger:

static NSString *CellIdentifier; 
if([indexPath row] == 0){ 
    CellIdentifier = @"CustomCell"; 
} else { 
    CellIdentifier = @"Cell"; 
} 

Je ne suis pas sûr de votre problème de bouton d'édition, mais il pourrait être lié.

+0

Oui en rétrospective, je suis également tout à fait sûr que c'est ce qui est arrivé. L'approche de if (indexPath.row == 0) est correcte. Construire une cellule personnalisée pour la première rangée et utiliser un identifiant différent est la bonne façon de procéder. – RickiG

Questions connexes