web-dev-qa-db-fra.com

Comment détecter un changement dans UISegmentedControl à partir d'un IBAction séparé

J'ai un bouton UISegmentedControl avec trois segments. Dans ViewController.m cela fonctionne très bien - appuyer sur les boutons déclenche les bonnes méthodes.

J'ai une autre variable UIButton distincte qui, lorsqu'elle est activée, doit d'abord VÉRIFIER l'état de la variable UISegmentedControl (pour voir quel bouton est actuellement enfoncé), puis déclencher une méthode en fonction de la valeur de ce segment.

Voici mon code pour cette variable UIButton. Le bouton lui-même fonctionne, mais je n'arrive pas à comprendre comment obtenir la valeur actuelle du segment de la variable UISegmentedControl.

Merci beaucoup pour toute aide ici. Je suis nouveau à OBJ-C. Je sais comment procéder de la manière suivante dans VisualBasic; les réponses plus verbeuses seraient donc les plus appréciées, car j’ai besoin de connaître le "pourquoi". Je vous remercie.

- (IBAction)decodeButton:(id)sender {
    UISegmentedControl *segment = [UISegmentedControl alloc];  // THIS DOES NOT WORK.

    if (segment.selectedSegmentIndex == 0) {
                decode(textToDecode);
    } else if(segment.selectedSegmentIndex == 1) {
                decode1(textToDecode);
    } else if(segment.selectedSegmentIndex == 2) {
                decode2(textToDecode); 
    }
}
11
mstace

Ici est un didacticiel utilisant UISegmentedControl sous iOS.

Créez simplement un objet de référence et connectez-le correctement au propriétaire du fichier.

IBOutlet UISegmentedControl *segmentedControl;

Puis définir la propriété

@property (strong, nonatomic) IBOutlet UISegmentedControl * segmentedControl;

Synthétiser dans un fichier .m

@synthesize segmentedControl;

Vous pouvez maintenant accéder à l'index sélectionné à tout moment.

- (IBAction)decodeButton:(id)sender {

    if (segmentedControl.selectedSegmentIndex == 0) {
                decode(textToDecode);
    } else if(segmentedControl.selectedSegmentIndex == 1) {
                decode1(textToDecode);
    } else if(segmentedControl.selectedSegmentIndex == 2) {
                decode2(textToDecode); 
    }
}
18
Siba Prasad Hota

Votre code alloc à chaque fois UISegmentedControl dans l'action du bouton. Utilisez donc le code suivant pour la création de sUISegmentedControl et son action.

 SegmentChangeView=[[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"Segment1",@"Segment2",@"Segment3",nil]];
    SegmentChangeView.frame=CGRectMake(5, 44, self.view.bounds.size.width-10, 33);
    SegmentChangeView.selectedSegmentIndex=0;
    SegmentChangeView.segmentedControlStyle=UISegmentedControlStyleBar;
    SegmentChangeView.momentary = YES;
    [SegmentChangeView setTintColor:[UIColor blackColor]];
    NSDictionary *attributes =[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Arial" size:13],UITextAttributeFont,nil];
    [SegmentChangeView setTitleTextAttributes:attributes forState:UIControlStateNormal];
    [SegmentChangeView addTarget:self action:@selector(SegmentChangeViewValueChanged:) forControlEvents:UIControlEventValueChanged];
    SegmentChangeView.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleBottomMargin;
    [self.view addSubview:SegmentChangeView];

-(IBAction)SegmentChangeViewValueChanged:(UISegmentedControl *)SControl
{
    if (SControl.selectedSegmentIndex==0)
    {
          decode(textToDecode);
    }
    else if (SControl.selectedSegmentIndex==1)
    {
            decode1(textToDecode);
    }
else if (SControl.selectedSegmentIndex==2)
    {
            decode2(textToDecode);
    }


}
4
Senthilkumar

Vous devez supprimer UISegmentedControl *segment = [UISegmentedControl alloc] ; de votre code, car il alloue à chaque fois une nouvelle instance de votre UISegmentedControl,

créer un point de vente pour vous UISegmentController comme

@property (strong, nonatomic) IBOutlet UISegmentedControl * segment;

et plus tard à tout moment dans votre fichier viewcontroller.m, vous pouvez obtenir le segment actuellement sélectionné en utilisant

segment.selectedSegmentIndex;

J'espère que ça a du sens,

Cordialement

3
D_D

Ce code signifie que vous créez un nouvel objet à chaque clic.

 UISegmentedControl *segment = [UISegmentedControl alloc] ;

La chose que vous devez faire prend IBOutlet (propriété) de votre segmentedControl alors je travaillerai pour vous. ne créez pas un nouvel objet dans la méthode du bouton. lorsque vous ferez un IBOutlet, il sera lié à segmentControl et votre code fonctionnera à ce moment-là. Merci

1
junaidsidhu

Essayez comme ça

- (IBAction)segmentedControlChanged:(id)sender
{
   UISegmentedControl *s = (UISegmentedControl *)sender;

   if (s.selectedSegmentIndex == 1)
   {
      //code
   }
   else
   {
      //code
   }
}
1
svmrajesh