Search code examples
objective-cuisegmentedcontrolios13

Specifying UISegmentedControlNoSegment to UISegmentedControl's selectedSegmentIndex has no Effect on iOS 13


I am the maintainer of STAControls which subclasses various UIControls, one of which is UISegmentedControl. Within that project's sample app, I have the following code (can be downloaded from the aforementioned link):

- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSInteger integer = [textField.text integerValue];
    if (integer < 0 || integer >= self.segmentedControl.numberOfSegments) { this doesn't work
        self.segmentedControl.selectedSegmentIndex = UISegmentedControlNoSegment;
    } else { // this works
        self.segmentedControl.selectedSegmentIndex = integer;
    }
}

In iOS 13 the UISegmentedControlNoSegment assignment is not respected:

enter image description here

While in iOS 12 and prior versions of iOS this performs just fine:

enter image description here

Any idea(s) on how to work around this?


Solution

  • Resolved and added a work around in STASegmentedControl. I did the following:

    - (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex {
        if (@available(iOS 13.0, *)) {
            if (selectedSegmentIndex == UISegmentedControlNoSegment && self.selectedSegmentIndex >= 0
                && !self.handlingNoSegment)
            {
                self.handlingNoSegment = YES;
                NSUInteger index = self.selectedSegmentIndex;
                NSString *title = [self titleForSegmentAtIndex:self.selectedSegmentIndex];
                [self removeSegmentAtIndex:self.selectedSegmentIndex animated:NO];
                [self insertSegmentWithTitle:title atIndex:index animated:NO];
            }
            self.handlingNoSegment = NO;
        }
        [super setSelectedSegmentIndex:selectedSegmentIndex];
    }
    

    Consult this link for the entire commit.