UISegmentedControl ändert die Anzahl der Segmente programmgesteuert

74

Gibt es eine Möglichkeit, die Anzahl der Segmente programmgesteuert zu ändern?

Beppino66
quelle

Antworten:

136

Ja, du kannst verwenden

removeSegmentAtIndex:(NSUInteger) animated:(BOOL)

Und

insertSegmentWithTitle:(NSString *) atIndex:(NSUInteger) animated:(BOOL)
Narbe
quelle
Ich löste mit: [self.SegmentAnswer insertSegmentWithTitle: @ "5" atIndex: 4 animiert: YES]; [self.SegmentAnswer insertSegmentWithTitle: @ "6" atIndex: 5
Beppino66
46

Um die Segmente vollständig zu ersetzen, können Sie die folgende Funktion verwenden:

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

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

Hoffe das hilft.

Zorayr
quelle
2
Dies war perfekt, um in eine UISegmentedControl-Kategorie eingeordnet zu werden. Vielen Dank!
DonnaLea
1
Sie können [segmentController removeAllSegments] anstelle der while-Schleife verwenden. Siehe die Dokumentation unter developer.apple.com/library/ios/documentation/UIKit/Reference/…
MCR
Zur Überprüfung ist es sowohl für 7.X als auch für 8.X verfügbar.
Zorayr
Bearbeitet, um [segmentController removeAllSegments] gemäß dem Kommentar von @ MCR verwendet zu werden.
Zorayr
26

Und hier ist eine kleine Swift-Erweiterung, um das aktuelle segmentedControl durch eine Reihe neuer Werte zu ersetzen

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)
        }
    }
}
Kernelpanic
quelle
3

Der Vollständigkeit halber (und weil ich hier gelandet bin, um zu sehen, wie man dasselbe in xib erreicht) ist hier, wie man es in xib macht:

Geben Sie hier die Bildbeschreibung ein

simon_smiley
quelle
3

Hier ist eine Swift-Erweiterung zum Ersetzen der Segmente durch eine Folge von Zeichenfolgen. Es ähnelt einer anderen hier gegebenen Antwort , außer dass es mit jeder Sequenz verwendet werden kann, was bedeutet, dass Sie auch Slices, Sets usw. übergeben können.

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)
        }
    }
}
Gemeinschaft
quelle
1
Können Sie einen Link zu der anderen Antwort hinzufügen, auf die Sie sich beziehen? Sie können einen Permalink zu einer Antwort erhalten, indem Sie auf den Link "Teilen" darunter klicken.
Al Sweigart
0

Arbeit für mich, UIsegmentedControll enthält zwei Segmente, ich möchte eines in Index 2 hinzufügen, verwenden Sie diesen Code in Swift 2.2 verwenden:

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

Hinzufügen und Löschen von Segmenten in swift4 mithilfe von Code

class ViewController: UIViewController {

  @IBOutlet weak var segment1: UISegmentedControl!

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
  }

  @IBAction func insert(_ sender: Any) {  
    segment1.insertSegment(withTitle: "\(segment1.numberOfSegments+1)", at: segment1.numberOfSegments, animated: true)  
  }

  @IBAction func remove(_ sender: Any) {  
    segment1.removeSegment(at: segment1.numberOfSegments-1, animated: true)
  }
}
Faizal Nowshad KN
quelle