UISegmentedControl change number of segments programmatically

Is there a way to change the number of segments programmatically?


Solution 1:

Yes, you can use

removeSegmentAtIndex:(NSUInteger) animated:(BOOL)

And

insertSegmentWithTitle:(NSString *) atIndex:(NSUInteger) animated:(BOOL)

Solution 2:

To replace the segments entirely, you can use the following function:

- (void)setSegments:(NSArray *)segments
{
    [segmentController removeAllSegments];

    for (NSString *segment in segments) {
        [segmentController insertSegmentWithTitle:segment atIndex:segmentController.numberOfSegments animated:NO];
    }
}

Hope this helps.

Solution 3:

And here's a little Swift extension to replace current segmentedControl with array of new values

Swift 3

extension UISegmentedControl {
    func replaceSegments(segments: Array<String>) {
        self.removeAllSegments()
        for segment in segments {
            self.insertSegmentWithTitle(segment, atIndex: self.numberOfSegments, animated: false)
        }
    }
}

Swift 4

extension UISegmentedControl {
    func replaceSegments(segments: Array<String>) {
        self.removeAllSegments()
        for segment in segments {
            self.insertSegment(withTitle: segment, at: self.numberOfSegments, animated: false)
        }
    }
}

Solution 4:

Here is a Swift extension for replacing the segments with a sequence of strings. It’s similar to another answer given here except it can be used with any sequence, meaning you can also pass in slices, sets, etc.

extension UISegmentedControl {

    /// Replace the current segments with new ones using a given sequence of string.
    /// - parameter withTitles:     The titles for the new segments.
    public func replaceSegments<T: Sequence>(withTitles: T) where T.Iterator.Element == String {
        removeAllSegments()
        for title in withTitles {
            insertSegment(withTitle: title, at: numberOfSegments, animated: false)
        }
    }
}