2010-06-15 3 views
56

J'ai ajouté un UISegmentedControl dans mon application. Aucun des boutons n'est sélectionné dans l'état normal. Je veux implémenter un événement de clic de bouton quand le premier segment est sélectionné, et un autre événement quand un autre bouton est cliqué.Définir l'événement de clic pour UISegmentedControl

+0

Comment définir le segment ordinaire dans UISegmented Control. Merci. – Pugal

+0

@Pugal devan définir la propriété de style de contrôle de segment segmentedControl.segmentedControlStyle = UISegmentedControlStyleBordered; – Warrior

Répondre

122

Si je comprends bien votre question, il vous suffit de mettre en œuvre un méthode target-action (prise en charge par UIControl qui est la classe parente de UISegmentedControl) pour la constante UIControlEventValueChanged, exactement comme dans l'exemple donné dans reference documentation de UISegmentControl.

à-dire

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

utilisé pour un message avec la signature suivante:

- (void)action:(id)sender 

ou

[segmentedControl addTarget:self 
        action:@selector(action:forEvent:) 
      forControlEvents:UIControlEventValueChanged]; 

pour

- (void)action:(id)sender forEvent:(UIEvent *)event 

ou

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

pour la méthode la plus simple:

- (void)action 

qui sont des types standard de sélecteurs-action cible utilisée dans UIKit.

+5

Juste un rapide heads-up: Je crois que si vous définissez la méthode comme - (void) action, alors vous voulez que le sélecteur soit @selector (action), sinon il va planter. –

+1

Le sélecteur doit correspondre exactement au message, mais sans paramètre, donc @selector (action: forEvent :) est le sélecteur de l'action "- (void): (id) expéditeur forEvent: (UIEvent *) event" – Jonathan

+0

J'ai une question , cette action sera-t-elle appelée même si je change l'index sélectionné manuellement? Si je ne veux pas que cela arrive, puis-je écouter un autre événement de contrôle? – JohnVanDijk

2

Vous pouvez joindre un gestionnaire dans IB à la valeur événement changé: UIControlEventValueChanged

ou vous pouvez le faire dans le code:

[segmentedControl addTarget:self 
        action:@selector(action:) 
      forControlEvents:UIControlEventValueChanged]; 
9

Essayez celui-ci,

UISegmentedControl * travelModeSegment = [[UISegmentedControl alloc] initWithItems: 
    [NSArray arrayWithObjects:NSLocalizedString(@"Driving", nil),     NSLocalizedString(@"Walking", nil), nil]]; 
    [travelModeSegment setFrame:CGRectMake(9.0f, 0.0f, 302.0f, 45.0f)]; 
    [cell addSubview:travelModeSegment]; 
    [travelModeSegment release]; 

puis écrire une action,

 if (travelModeSegment.selectedSegmentIndex == 0) { 
     //write here your action when first item selected 
    } else { 
     //write here your action when second item selected 
    } 

J'espère que cela vous aidera

7

Il convient de noter que le sélecteur doit correspondre une méthode exactement, mais sans les paramètres réels. Cela m'a troublé le plus longtemps, et ce n'est pas très clair à partir des réponses précédentes.

+1

Merci beaucoup pour vos explications, Jonathan. Cela a été l'une de ces choses que j'ai besoin de clarifier pour moi-même pour ... erm ... 'assez tôt maintenant ;-)' Bien présenté, aussi; c'est parti directement dans ma bibliothèque de code! :-) – Slowburner

64

essayez ceci:

- (IBAction)segmentSwitch:(UISegmentedControl *)sender { 
     NSInteger selectedSegment = sender.selectedSegmentIndex; 

     if (selectedSegment == 0) { 

     } 
     else{ 

     } 
    } 
4

simple comme ça, vous devez faire l'action à l'aide du story-board au contrôleur de vue afin de rendre cette action pour travailler.

- (IBAction)searchSegmentedControl:(UISegmentedControl *)sender 
{ 
    switch (sender.selectedSegmentIndex) { 
     case 0: 
      NSLog(@"First was selected"); 
      break; 
     case 1: 
      NSLog(@"Second was selected"); 
      break; 
     case 2: 
      NSLog(@"Third was selected"); 
      break; 
     default: 
      break; 
    } 
} 
6

pour SWIFT ceci:

segmentedControl.addTarget(self, action: "segmentSelected:", forControlEvents: UIControlEvents.ValueChanged) 

et mettre en œuvre une méthode comme ceci:

func segmentSelected(sender: UISegmentedControl) 
{ 
    println("selected index: \(sender.selectedSegmentIndex)") 
} 

Étendre UISegmentedControl si vous voulez appeler une action spécifique lorsque est sélectionné le segment sélectionné:

class CustomSegmentedControl : UISegmentedControl 
{   
    override init() 
    { 
     super.init() 
    } 

    override init(frame:CGRect) 
    { 
     super.init(frame:frame) 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    func valueChanged(index:Int) 
    { 
     // ACTION GOES HERE 
    }  
} 

et appelez votre "valueChanged" dans "segmentSelected" comme ceci:

func segmentSelected(sender: CustomSegmentedControl) 
{ 
    println("selected index: \(sender.selectedSegmentIndex)") 
    sender.valueChanged(sender.selectedSegmentIndex) 
} 
3

Version simple en rapide mise à jour

func loadControl(){ 
    self.yourSegmentedControl.addTarget(self, action: #selector(segmentSelected(sender:)), forControlEvents: .valueChanged) 
} 

func segmentSelected(sender: UISegmentedControl) 
{ 
    let index = sender.selectedSegmentIndex 

    // Do what you want 
} 
+1

dernière syntaxe swift: self.segmentedControl.addTarget (self, action: #selector (segmentSelected (sender :)), pour: .valueChanged) – Gilles

Questions connexes