2 votes

didDeselectRowAtIndexPath n'est pas appelé lorsque la case à cocher est déjà cochée

J'utilise UITableView avec des cases à cocher. Dans mon cellForRowAtIndexPath j'ai sélectionné quelques cellules comme suit,

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if(tableView == self.sideBarTbl){
    cell.textLabel.text = [titleArray objectAtIndex:indexPath.row];
    cell.tag = indexPath.row;
    if(indexPath.row == 0){
        [cell setSelected:true];
    }else if(indexPath.row == 1){
        [cell setSelected:true];
    }else {
        [cell setSelected:false];
    }
}

En bref, si la ligne est 0,1, je vérifie les cases à cocher de l'UITableView.

lorsque l'utilisateur clique sur la ligne 0 ou la ligne 1, il doit appeler didDeselectRowAtIndexPath puisque les cases de la ligne 0 et de la ligne 1 sont déjà cochées. Mais il appelle toujours la fonction didSelectRowAtIndexPath . que la case soit cochée ou non, il appelle toujours la fonction didSelectRowAtIndexPath . Comment puis-je le laisser appeler ? didDeselectRowAtIndexPath lorsque la case est cochée et appeler didSelectRowAtIndexPath lorsque la case n'est pas cochée ?

2voto

Yun CHEN Points 3978

didDeselectRowAtIndexPath ne sera appelée que pour les cellules qui ont été touchées pour être sélectionnées auparavant. Elle n'est pas liée à l'état de la cellule. selected propriété. Si vous voulez faire quelque chose pour les cellules désélectionnées, il suffit d'enregistrer la sélection manuellement dans NSMutableArray avec didSelectRowAtIndexPath méthode. Oubliez les didDeselectRowAtIndexPath . Pour référence : La cellule UITableView doit revenir à l'état précédent lors d'un double clic

Et un exemple en Objective-C :

@interface SomeViewController : UIViewController<UITableViewDelegate> {
    NSMutableArray *selectedIndexPaths;
}

@implementation SomeViewController
//......
- (void)viewDidLoad {
    [super viewDidLoad];
    selectedIndexPaths = [NSMutableArray array];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([selectedIndexPaths containsObject:indexPath]) {
        [selectedIndexPaths removeObject:indexPath];
        //Do something when deselecting.
    }
    else{
        [selectedIndexPaths addObject:indexPath];
        //Do something when selecting.
    }
}
//......
@end

Si la sélection est unique et exclusive, comme dans le cas d'une radiobox, il suffit d'utiliser une variable unique. NSIndexPath *selectedIndexPath; pour enregistrer la sélection dans didSelectRowAtIndexPath après avoir traité le processus de désélection de la cellule sélectionnée précédente.

1voto

Stanly Moses Points 1307

Utilisez le code suivant dans votre cellForRowAtIndexPath au lieu de [cell setSelected:true];

  [tableView  selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];`

Utilisez le code suivant lorsque l'utilisateur souhaite désélectionner. Utilisez-le dans votre didDeselectRowAtIndexPath

[tableView deselectRowAtIndexPath:indexPath animated:YES];

Enfin, vous pouvez obtenir les index sélectionnés comme suit,

-(void) getSelectedIndices
{
    NSArray *indexPathArray = [tableView  indexPathsForSelectedRows];
    for(NSIndexPath *index in indexPathArray)
    {
        NSLog(@"Index: %ld",(long)index.row);
    }
}

Revenez dans le cas où vous auriez des questions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X