18 Stimmen

Ändern Sie das ausgewählte Index oder den Wert des UISegmentedControl programmatisch

Ich habe einen UISegmentedControl mit zwei Segmenten (Index: 0 und 1), den ich programmgesteuert auf 0 zurücksetzen möchte. Wenn ich den folgenden Befehl ausführe, wird der Segmentindex nicht wie erwartet auf 0 zurückgesetzt. Stattdessen wird das Segment mit Index 1 hervorgehoben.

    [seg setSelectedSegmentIndex:0];

Ungewöhnlicherweise gibt es, wenn ich das ausgewählte Segment protokolliere, 0 zurück.

    NSLog(@"seg setSelectedSegmentIndex %d", seg.selectedSegmentIndex); 

Ebenso merkwürdig ist, dass ich nach dem Ausführen von setSelectedSegmentIndex:0 Segment 0 nicht manuell durch Berührung erneut auswählen kann. Es scheint auf Segment 1 festgelegt zu sein, bis ich 1 antippe, woraufhin es wie gewohnt funktioniert.

Hier ist das Setup für den Button:

    itemArray = [NSMutableArray arrayWithObjects: @"Null", @"Eins", nil];
    seg = [[UISegmentedControl alloc] initWithItems:itemArray];
    [seg setFrame:segRect];
    seg.segmentedControlStyle = UISegmentedControlStyleBar;
    seg.momentary = NO;
    [seg addTarget:self action:@selector(someAction:) forControlEvents: UIControlEventValueChanged];
    [mainView addSubview:seg];

HINWEIS: Um zu wiederholen, was ich mit dieser Frage erreichen wollte: Ich möchte den ausgewählten Index eines UISegmentedControl dynamisch über eine Variable setzen, das entsprechende visuelle Feedback erhalten und den ausgewählten Index in einer Methode überprüfen, um je nach ausgewähltem Index etwas geschehen zu lassen. Siehe meine Antwort unten für eine Lösung.

30voto

Krishnan8190 Punkte 320

Änderung in viewDidLoad:

[seg setSelectedSegmentIndex:index];

Sie können den Indexwert nach Belieben ändern.

2voto

NewStack Punkte 990

Vom Code aus kannst du einfach seg.selectedSegmentIndex = someDefaultIndex machen.

Ob du es in viewDidLoad: setzen solltest oder nicht, hängt ganz von der Struktur deiner Anwendung ab. Wenn zum Beispiel deine App gestartet wird und die Ansicht zum ersten Mal geladen wird und den Wert des Steuerelements auf den Wert setzen muss, den es während des vorherigen App-Laufs hatte, dann macht es auf jeden Fall Sinn, es dort zu tun.

2voto

Abhishek Jain Punkte 4341

Swift 3.0

segmentedControl.selectedSegmentIndex = #dein Wert#

2voto

novecento88 Punkte 128

Die richtige Antwort ist die @arcady bob an dieser Link. Ich habe eine aktualisierte Version für Swift 5 gepostet, die ich hier zitiere:

yourSegmentedControl.selectedSegmentIndex = 0

yourSegmentedControl.sendActions(for: UIControl.Event.valueChanged)

Wenn Sie nur die erste Zeile verwenden, wird das Segment entsprechend grafisch reagieren, aber Ihre IBAction, die mit dem Segmentsteuerelement verbunden ist, wird nicht aufgerufen. In wenigen Worten: Die zweite Zeile ist wie ein Tippen auf das Segmentsteuerelement. Das ist das, was ich brauchte und was mir fehlte.

1voto

OWolf Punkte 4948

Dies hilft, das ausgewählte Segment in Bezug auf das visuelle Feedback zu sortieren. Nachdem das ausgewählte Segment programmgesteuert festgelegt wurde, werden die Segmente entsprechend eingefärbt.

for (int i=0; i<[seg.subviews count]; i++)
{

    if ([[seg.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[seg.subviews objectAtIndex:i] isSelected])
    {
        [[seg.subviews objectAtIndex:i] setTintColor:[UIColor grayColor]];
    }
    if ([[seg.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[seg.subviews objectAtIndex:i] isSelected])
    {
        [[seg.subviews objectAtIndex:i] setTintColor:[UIColor blackColor]];
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X