2013-08-06 5 views
0

J'ai personnalisé UITableViewCell s où j'ai placé des boutons dynamiquement dans le code. J'ai programmé des actions pour de tels boutons, et quand l'action est déclenchée, alors j'ai besoin de recharger la table, entre autres choses. Une fois que le rechargement est appelé, le bouton de l'expéditeur disparaît, et je ne sais pas pourquoi ... Quelqu'un pourrait-il me donner un indice pour la raison possible? Si le bouton n'est pas appuyé, et que je fais défiler la table de haut en bas, elle reste là.Perdant UIButton dans une cellule personnalisée lors du rechargement de la table

Merci!

EDIT

Ceci est un extrait de code de cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSArray *listData =[self.tableViewEntries objectForKey:[self.sortedKeys objectAtIndex:[indexPath section]]]; 

    UITableViewCell *cell; 

    if (indexPath.section == 0) { 

    switch (indexPath.row) { 
     case 0: { 
      cell = [self.tableView dequeueReusableCellWithIdentifier:@"firstCell"]; 
      ((CustomCell *)cell).cellTextField.tag = firstCellTag; 
      cell.tag = firstCellTag; 
      break; 
     } 
     case 1: { 
      cell = [self.tableView dequeueReusableCellWithIdentifier:@"secondCell"]; 
      ((CustomCell *)cell).cellTextField.tag = secondCellTag; 
      cell.tag = secondCellTag; 
      break; 
     } 
    } 
    return cell; 
} 

Le CustomCell que j'ai défini est chargé d'un nib. Ces cellules ont un UITextField pour l'entrée de l'utilisateur et un UIView où je règle ou supprime dynamiquement les boutons dans le code en fonction de l'entrée de l'utilisateur dans le champ de texte. Les boutons sont créés dans le code, et leurs actions sont définies dans le code ainsi:

- (void)setButtonForCell:(UITableViewCell *)cell withResult:(BOOL)isValid 
{ 
    UIImage* validationButtonNormalImage = nil; 
    UIImage* validationButtonHighlightImage = nil; 

    UIButton *validationButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [validationButton setFrame:CGRectMake(0, 0, ((CustomCell *)cell).cellValidationView.frame.size.width, ((CustomCell *)cell).cellValidationView.frame.size.height)]; 

    if (isValid) { 
     validationButtonNormalImage =[[UIImage imageNamed:@"success.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0]; 
     validationButtonHighlightImage =[[UIImage imageNamed:@"success.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0]; 

     [validationButton removeTarget:self 
          action:@selector(validationButtonTapped:) 
        forControlEvents:UIControlEventTouchUpInside]; 
    } 
    else { 
     validationButtonNormalImage =[[UIImage imageNamed:@"error.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0]; 
     validationButtonHighlightImage =[[UIImage imageNamed:@"error.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0]; 

     [validationButton setTag:cell.tag]; 

     [validationButton removeTarget:self 
          action:@selector(validationButtonTapped:) 
        forControlEvents:UIControlEventTouchUpInside]; 

     [validationButton addTarget:self 
         action:@selector(validationButtonTapped:) 
       forControlEvents:UIControlEventTouchUpInside]; 
    } 


    [validationButton setBackgroundImage:validationButtonNormalImage forState:UIControlStateNormal]; 
    [validationButton setBackgroundImage:validationButtonHighlightImage forState:UIControlStateHighlighted]; 


    [((CustomCell *)cell).cellValidationView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)]; 
    [((CustomCell *)cell).cellValidationView addSubview:validationButton]; 
} 

Puis, en validationButtonTapped:, je fais des tâches et appelle à [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:NO];, et il y a quand je lâche le bouton de la vue. Cependant, si je n'appuie pas sur le bouton et que je défile vers le bas et vers le haut pour que le bouton 'cellForRowAtIndexPath:' soit à nouveau appelé, le bouton reste ici. C'est comme si je perdais seulement quand j'appelais pour un rechargement.

Une aide?

+0

pouvez-vous s'il vous plaît poster votre code ...? –

Répondre

0

Les cellules sont généralement réutilisées si vous suivez le modèle habituel cellForRowAtIndexPath:. Retirez-vous toutes les sous-vues de prepareForReuse pour chaque cellule? Si ce n'est pas le cas, vous verrez des boutons inattendus sur les cellules lorsque vous faites défiler vers le haut et vers le bas. Vous devez probablement ajouter les boutons requis dans la configuration de chaque cellule après vous obtenez la cellule pour réutilisation (ou dans un code plus récent, dequeue une cellule) dans .

+0

Je comprends ... depuis que je crée le bouton dans le code et l'ajoute à la cellule comme ceci: '[myCustomcell addSubview: button];', comment pourrais-je conserver ce bouton? Ou devrais-je avoir de fortes propriétés pour eux? – AppsDev

+0

Oui, vous devriez avoir des propriétés solides pour les boutons pour le retenir – iEinstein

Questions connexes