2010-12-07 11 views
2

J'ai un UITableViewController qui a deux sections. La première section montre une seule cellule avec un texte centré, en disant Add a new Slide. La deuxième section montre les diapositives actuelles.Mon UITable réutilise des cellules quand il ne devrait pas!

Lorsqu'un utilisateur appuie sur la cellule Add a new slide, un nouveau UITableVeiwController est inséré dans la pile pour afficher un éditeur. Si l'utilisateur enregistre la nouvelle diapositive (en appuyant sur Enregistrer), la cellule est ajoutée à la source de données et l'éditeur est retiré de la pile.

J'ai deux problèmes:

  1. Lorsque l'éditeur est sauté, si une cellule a été supprimée avant Add a new slide a été taraudés, l'ancienne cellule apparaît au lieu de la nouvelle. Popping le UITableViewController (en appuyant sur le bouton de retour généré automatiquement) résout cela, mais je voudrais que cela n'arrive pas du tout. (À l'origine, popping la table ne met pas à jour après popping l'éditeur, alors j'ai ajouté [self.tableView reloadData]; la méthode viewDidAppear.)

  2. Après un certain nombre de diapositives, la dernière diapositive sur la liste devient la cellule Add a new slide. Je sais que les données sont entrées correctement car une autre partie de l'application, qui utilise la même source de données, se met correctement à jour. La table prend en charge l'édition dans la deuxième section, et quand vous permutez l'ordre des cellules, elle se comporte correctement dans les coulisses, mais la mauvaise cellule est toujours là.

Que pourrait-il se passer?

est ici une partie de mon code:

Notez que je préparais pour poster mon code, j'ai remarqué un décalage des accolades. La vérification decell==nilsemble englober la deuxième partie du code qui détermine le contenu des cellules. Cela corrige l'étiquette des cellules dans la deuxième section de la table, mais le style est toujours faux. J'ai depuis corrigé le code, mais l'original est posté ici.

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     if ([indexPath section] == 0) { 
      cell = [[[MBTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     }else if([indexPath section] == 1){ 
      cell = [[[MBTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 

    } 

    if ([indexPath section] == 0) { 
     [cell.textLabel setTextAlignment:UITextAlignmentCenter]; 
     [cell.textLabel setText:@"Add a New Slide"]; 
    }else if([indexPath section] == 1){ 
     NSArray *storedViewsInfo = [[NSArray alloc] initWithArray:[kSettings arrayForKey:@"views"]]; 

     if ([[[storedViewsInfo objectAtIndex:[indexPath row]] valueForKey:@"type"] isEqualToString:@"announcement"]) { 
      [cell.detailTextLabel setText:@"Custom Announcement"]; 
      [cell.textLabel setText:[[[storedViewsInfo objectAtIndex:[indexPath row]] valueForKey:@"info"] valueForKey:@"text"]]; 
     } 

     [storedViewsInfo release]; 
     [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; 

    } 
    } 
    return cell; 

} 
+0

pouvez-vous poster '- (void) tableView: (UITableView *) tableViewDisplayCell: (UITableViewCell *) cellule pourRowAtIndexPath: (NSIndexPath *) indexPath' –

Répondre

3

Sans voir le code, la première chose qui vient à l'esprit est de vérifier si vous avez donné vos cellules personnalisées différents identifiants dans votre méthode - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier1 = @"CellIdentifier1"; 
    static NSString *Cellidentifier2 = @"CellIdentifier2"; 

    if (indexPath.section == kAddSlideSection) { 
     CustomCell *cellType1 = (CustomCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; 
     ... 
    } else { 
     CustomCell *cellType2 = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; 
     ... 
    } 
} 

En outre, il pourrait être utile d'envisager la mise en œuvre d'une méthode déléguée qui est appelée lorsque votre utilisateur se termine en ajoutant la nouvelle diapositive - à savoir si l'appel est réussi [self.tableview reloadData] de cette méthode au lieu de viewWillAppear.

+0

Points intéressants! – Moshe

+0

Cela corrige les bogues, mais soudain, j'ai des problèmes de stabilité/performance. Que se passe-t-il? – Moshe

+0

Quel genre de problèmes? Est-ce qu'il s'écrase et si oui où? – Rog