Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UISegmentedControl register taps on selected segment

I have a segmented control where the user can select how to order a list. Works fine.

However, I would like that when an already selected segment is tapped, the order gets inverted. I have all the code in place, but I don't know how to register the taps on those segments. It seems the only control event you can use is UIControlEventValueChanged, but that isn't working (since the selected segment isn't actually changing).

Is there a solution for this? And if so, what is it?

Thanks in advance!

like image 785
Pieter Jongsma Avatar asked Oct 25 '09 13:10

Pieter Jongsma


1 Answers

You can subclass UISegmentedControl, and then override setSelectedSegmentIndex:

- (void) setSelectedSegmentIndex:(NSInteger)toValue {     if (self.selectedSegmentIndex == toValue) {         [super setSelectedSegmentIndex:UISegmentedControlNoSegment];     } else {         [super setSelectedSegmentIndex:toValue];             } } 

If using IB, make sure you set the class of your UISegmentedControl to your subclass.

Now you can listen for the same UIControlEventValueChanged as you would normally, except if the user deselected the segment, you will see a selectedSegmentIndex equal to UISegmentedControlNoSegment:

-(IBAction) valueChanged: (id) sender {     UISegmentedControl *segmentedControl = (UISegmentedControl*) sender;     switch ([segmentedControl selectedSegmentIndex]) {         case 0:             // do something             break;         case 1:             // do something             break;         case UISegmentedControlNoSegment:             // do something             break;         default:             NSLog(@"No option for: %d", [segmentedControl selectedSegmentIndex]);     } } 
like image 61
Julian Avatar answered Oct 03 '22 02:10

Julian