UISegmentedControl ändert die Anzahl der Segmente programmgesteuert


Antworten:


136

Ja, du kannst verwenden

removeSegmentAtIndex:(NSUInteger) animated:(BOOL)

Und

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

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.


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

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


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

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)

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)
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.