Accéder au contenu principal

UISwitch dans un UITableViewCell





Je construis des formulaire dans des UITable, chaque UITableViewCell peut donc contenir des UILabel, UISwitch, UIButton, etc. Je partage le code entre plusieurs application, mais j'ai eu un bug dans l'une d'elles que je n'avais pas dans les autres. Les gadgets interactifs ne fonctionnaient pas...

En fait, j'avais construit mes UITableViewCell avec du code comme celui-ci :

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    self.backgroundColor = [UIColor clearColor];


    _uiLabel = [UILabel new];

    _uiLabel.frame = CGRectMake(8, 4, self.frame.size.width-51-24, self.frame.size.height-8);

    _uiLabel.translatesAutoresizingMaskIntoConstraints = NO;

    _uiLabel.textAlignment = NSTextAlignmentLeft;

    _uiLabel.lineBreakMode = NSLineBreakByWordWrapping;

    _uiLabel.adjustsFontSizeToFitWidth = YES;

    _uiLabel.minimumScaleFactor = 0.5;

    _uiLabel.numberOfLines = 0  ;

    _uiLabel.text = NSLocalizedString(@"none", nil);

    [_uiLabel  removeConstraints:_uiLabel.constraints];

    [self addSubview:_uiLabel];

    

    _uiSwitch = [UISwitch new];

    _uiSwitch.frame = CGRectMake(self.frame.size.width-_uiSwitch.frame.size.width-8,

                                 self.frame.size.height/2-16,

                                 _uiSwitch.frame.size.width,

                                 _uiSwitch.frame.size.height);

    _uiSwitch.translatesAutoresizingMaskIntoConstraints = NO;

    

    [_uiSwitch addTarget:self action:@selector(changeOn:) forControlEvents:UIControlEventValueChanged];


    [_uiSwitch removeConstraints:_uiSwitch.constraints];

    [self addSubview:_uiSwitch];



    NSDictionary *children =@{ @"label":_uiLabel,@"sw":_uiSwitch };

    [self addConstraints:[NSLayoutConstraint

                          constraintsWithVisualFormat:@"H:|-8-[label(>=160)]-8-[sw]-16-|"

                          options:0 metrics:nil views:children]];

    [self addConstraints:[NSLayoutConstraint

                          constraintsWithVisualFormat:@"V:|-8-[label]-8-|"

                          options:0 metrics:nil views:children]];

    [self addConstraints:[NSLayoutConstraint

                          constraintsWithVisualFormat:@"V:|-8-[sw]-8-|"

                          options:0 metrics:nil views:children]];


    [self setNeedsLayout];

    return self;

}


Mon erreur était dans l'appel de addSubView, il ne faut pas mettre les éléments directement dans le UITableViewCell, car la contentView peut alors se retrouver au-dessus et empêcher les interactions. 
Il faut donc mettre :


    [self.contentView addSubview:_uiLabel];

    [self.contentView addSubview:_uiSwitch];


Remplacer self par self.contentView règle le problème. On doit aussi s'occuper des addConstraints qui devraient aussi être mis à self.contentView.

    NSDictionary *children =@{ @"label":_uiLabel,@"sw":_uiSwitch };

    [self.contentView addConstraints:[NSLayoutConstraint 

     constraintsWithVisualFormat:@"H:|-8-[label(>=160)]-8-[sw]-16-|"

                         options:0 metrics:nil views:children]];

    [self.contentView addConstraints:[NSLayoutConstraint

     constraintsWithVisualFormat:@"V:|-8-[label]-8-|"

                         options:0 metrics:nil views:children]];

    [self.contentView addConstraints:[NSLayoutConstraint

     constraintsWithVisualFormat:@"V:|-8-[sw]-8-|"

                         options:0 metrics:nil views:children]];




Commentaires

Posts les plus consultés de ce blog

Tiret insécable

 Ecrivant un livre sur CoreAnimation en Objective-C et en Swift, j'écris souvent "Objective-C".  Mais je ne souhaite pas que la césure du texte se face avec le C, il me faut donc un tiret insécable. Malheureusement il n'y a pas de tiret insécable sur le clavier du Mac, il faut donc utiliser le caractère Unicode U+2011. Mais le clavier du Mac ne comprends pas non plus par défaut de possibilité d'ajouter un caractère par son code Unicode.  Il faut donc aller dans les réglages d'Apple, dans les réglages du clavier, dans les méthodes de saisie et ajouter le clavier "Universel (Unicode Hex)". Ensuite, lorsque l'on a besoin d'un caractère Unicode, on change de clavier et on utilise la touche Option + le code en hexadécimal. Pour accélérer le changement d'un clavier à l'autre, toujours dans les réglages du clavier, vous pouvez activer les raccourcis clavier. Bon, c'était encore trop long, alors j'ai mis un remplacement automatique da

_UISheetInteractionBackgroundDismissRecognizer

Avec IOS13 les FormSheet et les PageSheet peuvent être quittés par un geste de glissement vers le haut. Mais si votre UIViewController contient un élément qui utilise les déplacements de doigts (UITouch) alors cela ne fonctionne plus à cause de la gestion de ce geste. Pour désactiver le geste, utilisez le code suivant : -( void ) viewDidAppear :( BOOL )animated {     [ super viewDidAppear :animated];     for ( UIGestureRecognizer *gr in self . presentationController . presentedView . gestureRecognizers ) {         if ( @available (iOS 11.0 , *)) {             if ([gr. name isEqualToString : @"_UISheetInteractionBackgroundDismissRecognizer" ]) {                 // disable la possibilité de quitter la feuille FormSheet ou PageSheet avec un glissement vers le haut                 gr. enabled = false ;             }         }     } }