web-dev-qa-db-fra.com

Définir un événement de clic pour UISegmentedControl

J'ai ajouté un UISegmentedControl dans ma candidature. Aucun des boutons n'est sélectionné à l'état normal. Je souhaite implémenter un événement de clic de bouton lorsque le premier segment est sélectionné et un autre événement lorsqu'un autre bouton est cliqué.

60
Warrior

Si je comprends bien votre question, il vous suffit d'implémenter une méthode d'action cible (prise en charge par UIControl qui est la classe parente de UISegmentedControl) pour la constante UIControlEventValueChanged, exactement comme dans l'exemple donné dans UISegmentControl documentation de référence .

c'est à 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];

for

- (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 d'action cible utilisés dans UIKit.

126
macbirdie

essaye ça:

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

      if (selectedSegment == 0) {

      }
      else{

      }
    }
65
Nuno Ferro

Essaye celui-là,

    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 écrivez 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

9
Sivanathan

Version simple en Swift mis à 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
}
8
Beninho85

Il convient de noter que le sélecteur doit correspondre exactement à une méthode, mais sans les paramètres réels.

@selector(action)
    => -(void) action { ..code.. }

@selector(action:) 
    => -(void) action:(id)sender { ..code.. }

@selector(action:forEvent:) 
    => -(void) action:(id)sender forEvent:(UIEvent *)event { ..code.. }

Cela m'a dérouté le plus longtemps et ce n'est pas tout à fait clair d'après les réponses précédentes.

7
Jonathan

pour Swift utilisez ceci:

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

et implémenter une méthode comme celle-ci:

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

Étendez UISegmentedControl si vous souhaitez appeler une action spécifique lorsque le segment sélectionné est 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)
}
6
datayeah

Aussi simple que cela, vous devez effectuer l'action à l'aide du storyboard sur le contrôleur de vue afin de faire fonctionner cette action.

- (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;
    }
}
4
rafaeljuzo

Vous pouvez attacher un gestionnaire dans IB à l'événement de valeur modifiée: UIControlEventValueChanged

ou vous pouvez le faire en code:

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