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.

0voto

OWolf Punkte 4948

Um zu wiederholen, was ich mit dieser Frage erreichen wollte: Ich möchte den ausgewählten Index eines UISegmentedControls 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.

Ursprünglich dachte ich, dass es so einfach ist wie: mySegmentedController.selectedSegmentIndex = someIndex, dann den Index überprüfen. Aber wie in meiner Frage angegeben, hat es bei mir nicht funktioniert. Das Verhalten ist merkwürdig. Nach Ausführen dieses Codes würde die entsprechende Schaltfläche nicht hervorgehoben.

Hier ist ein Projekt, bei dem ich es repariert habe, sodass es funktioniert. Nicht sicher, warum es genau funktioniert. Möglicherweise habe ich eine Verzögerung eingebaut, bevor ich den Index setze. Ich werde die Projektdatei aktualisieren und kommentieren, wenn ich sie verfeinern kann.

http://owolf.net/uploads/StackOverflow/SegmentedControllers.zip

0voto

Nick T Punkte 837

WARNUNG: Dies beantwortet die Frage nicht ganz, ist aber eng verwandt.

Ich hatte ein ähnliches Problem. Meistens funktionierte mein UISegmentedController gut. Es hat 4 Segmente: Aus, 30, 60 und 120.

In unregelmäßigen Abständen (normalerweise kurz vor einem Release) wird das Aus-Segment aus der Benutzeroberfläche nicht auswählbar. (Ich habe nicht versucht, es aus dem Code heraus auszuwählen, weil das nicht das ist, was ich tun muss und mein Problem nicht lösen würde.)

Die Lösung besteht darin, den UISegmentedController aus meinem XIB zu löschen und durch einen neuen (und genau identischen) zu ersetzen, der dann einwandfrei funktioniert.

Ich habe sogar den fehlerhaften UISegmentedController per CMD-C und CMD-V in ein anderes XIB einer App kopiert. Und das Aus-Segment (also dasjenige mit Index 0) war auch in diesem XIB nicht auswählbar.

Dies scheint ein Problem mit XCode zu sein.

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