2009-11-06 7 views
1

J'ai donc créé un TableViewCell personnalisé, et dans la plume j'ai mis un UISwitch. Avant même que je l'ai accroché à quelque chose, si je l'ai couru dans le simulateur et cliqué dessus, il allumerait de l'éteint à sur avec l'animation et tel.Désactiver la commutation automatique lorsque vous cliquez sur UISwitch?

J'essaie d'ajouter une fonctionnalité où l'utilisateur n'est autorisé à passer de l'état activé à désactivé que lorsqu'une certaine condition est vraie. Je le veux donc, lorsque l'utilisateur touche le commutateur, il vérifie si la condition est vraie, et si ce n'est pas le cas, le commutateur ne bouge pas.

J'ai mis en place un IBAction où si l'utilisateur touche à l'intérieur, il va exécuter ma fonction. Ma fonction est la suivante:

if([on_switch isOn]) 
    { 
     if([my_switch canSwitchOn]) 
     { 
      NSLog(@"SWITCHED ON SUCCESSFULLY"); 
      [on_switch setOn:TRUE animated:TRUE]; 
     } 
     else 
     { 
      NSLog(@"SWITCHED ON UNSUCCESSFULLY"); 
         //Put in popup here 
     } 
    } 
    else 
    { 
     [[ClassesSingleton sharedSingleton] classSwitchedOff:cell_index]; 
     [on_switch setOn:FALSE animated:TRUE]; 
    } 

Cependant, peu importe ce que je fais, ce commutateur inversera, même si je lui ai donné aucune instruction de le faire. Je suis à peu près sûr que c'est l'auto-flip qui l'a fait même avant que j'y aie accroché quoi que ce soit. Y a-t-il un moyen de l'éteindre?

Merci!

Répondre

3

Ce que vous devez faire est de définir la propriété userInteractionEnabled sur False sur votre UISwitch.

Si vous aviez allready fait la connexion dans Interface Builder un IBOutlet vous delared dans votre classe possédante, vous seriez en mesure de le mettre dans le code comme ceci:

mySwitch.userInteractionEnabled = NO; 

Vous pouvez également définir la propriété directement dans Interface Builder en sélectionnant la case à cocher, comme indiqué ci-dessous (Cependant, dans votre application, vous allez avoir besoin de câbler le bouton jusqu'à une IBOutlet de toute façon de mettre en œuvre votre logique conditionnelle.) alt text http://www.clixtr.com/photo/ef06c1f7-8cca-40cd-a454-5ca534ceb9fe

+0

J'ai essayé ça. Le problème est, il est sur un TableViewCell. Lorsque je désactive userInteractionEnabled et que j'essaie de cliquer sur le bouton, il touche la cellule derrière lui. La cellule va à une autre vue. J'en ai besoin pour toujours compter comme un objet, de sorte que la cellule ne soit pas touchée, mais pas l'autoswitch. – Ethan

+1

Vous pouvez vous rendre la vie facile en collant un UIView régulier sous le bouton (de la même taille exacte) qui a userInteraction Enabled. Ensuite, lorsque vous l'éteignez sur le bouton, les touches passeront à travers le commutateur, mais seront mangées par la vue régulière et ne toucheront jamais la cellule TableView –

+1

Une autre option serait simplement de mettre activé à NON sur le commutateur. Il grise le commutateur, de sorte que vous pouvez réellement dire qu'il ne fera rien avant d'appuyer dessus, et il ne passera pas le robinet à la cellule derrière elle. –

1

Je pense que vous aurez besoin de quelque chose comme le suivant:

// Somewhere just after the creation of _switch 
[_switch addTarget:self action:@selector(switchValueDidChange:) forControlEvents:UIControlEventValueChanged]; 

// Target/Action method 
- (void)switchValueDidChange:(UISwitch *)sender { 
    if(sender.on && [self canSwitchOn] == NO){ 
     [sender setOn:NO animated:YES]; 
     // Popup 
    } 
} 

Problème que vous avez est que le commutateur a déjà commis, il est sur l'état sur la retouche. Lorsque ce n'est pas le cas (je ne suis pas sûr, jamais testé), vous devez vérifier si le commutateur est actuellement et non. Ce bit de code rétablira l'état lorsque l'utilisateur n'a pas été autorisé à commuter le commutateur.

Une meilleure façon est de désactiver le contrôle, mais peut-être que ce n'est pas ce que vous voulez dans ce cas.