web-dev-qa-db-fra.com

UISegmentedControl change le nombre de segments par programmation

J'ai un UISegmentedControl dans une vue appelée SegmentedAnswer, avec quatre segments. Existe-t-il un moyen de modifier le nombre de segments par programme? Merci beaucoup!

63
Beppino66

Oui, vous pouvez utiliser

removeSegmentAtIndex:(NSUInteger) animated:(BOOL)

Et

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

Pour remplacer entièrement les segments, vous pouvez utiliser la fonction suivante:

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

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

J'espère que cela t'aides.

42
Zorayr

Et voici un petit Swift extension pour remplacer le segmentedControl actuel par un tableau de nouvelles valeurs

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)
        }
    }
}
20
kernelpanic

Voici une extension Swift pour remplacer les segments par une séquence de chaînes. Elle est similaire à autre réponse donnée ici sauf qu'elle peut être utilisée avec n'importe quelle séquence, ce qui signifie que vous pouvez passer également en tranches, ensembles, 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)
        }
    }
}
3
user7828620

Par souci d'exhaustivité (et parce que je me suis retrouvé ici à chercher comment réaliser la même chose dans xib), voici comment le faire dans xib:

enter image description here

2
simon_smiley

travailler pour moi, UIsegmentedControll contient deux segments, je veux ajouter un dans l'index 2, utilisez ce code dans Swift 2.2 use:

SEG_TipoFiltro.insertSegmentWithTitle("Title", atIndex: 2, animated: false)
0
Pablo Ruan