Define click event for UISegmentedControl

IosCocoa TouchUisegmentedcontrol

Ios Problem Overview


I have added a UISegmentedControl in my application. None of the buttons are selected in normal state. I want to implement a button click event when the first segment is selected, and another event when another button is clicked.

Ios Solutions


Solution 1 - Ios

If I understand your question correctly, you simply have to implement a target-action method (supported by UIControl which is UISegmentedControl's parent class) for the constant UIControlEventValueChanged, exactly like in the example given in UISegmentControl's reference documentation.

i.e.

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

used for a message with the following signature:

- (void)action:(id)sender

or

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

for

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

or

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

for the simplest method:

- (void)action

which are standard types of target-action selectors used in UIKit.

Solution 2 - Ios

try this:

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

Solution 3 - Ios

Simple version in swift updated

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

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

    // Do what you want
}

Solution 4 - Ios

Try this one,

    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];

then write an action,

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

I hope it will help you

Solution 5 - Ios

It's worth noting that the selector has to match a method exactly, but without the actual parameters.

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

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

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

This confused me for the longest time, and it's not quite clear from the earlier answers.

Solution 6 - Ios

for SWIFT use this:

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

and implement a method like this:

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

Extend UISegmentedControl if you want to call a specific action when the selected segment is selected:

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
    }      
}

and call your "valueChanged" in "segmentSelected" like this:

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

Solution 7 - Ios

Simple like that, you need to make the action using the storyboard to the view controller in order to make this action to work.

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

Solution 8 - Ios

You can attach a handler in IB to the value changed event: UIControlEventValueChanged

or you can do it in code:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionWarriorView Question on Stackoverflow
Solution 1 - IosmacbirdieView Answer on Stackoverflow
Solution 2 - IosNuno FerroView Answer on Stackoverflow
Solution 3 - IosBeninho85View Answer on Stackoverflow
Solution 4 - IosSivanathanView Answer on Stackoverflow
Solution 5 - IosJonathanView Answer on Stackoverflow
Solution 6 - Iosdy_View Answer on Stackoverflow
Solution 7 - IosrafaeljuzoView Answer on Stackoverflow
Solution 8 - IosprogrmrView Answer on Stackoverflow