Modifier l'index ou la valeur UISegmentedControl sélectionné par programme

J'ai un UISegmentedControl avec deux segments (index: 0 et 1) que j'essaie de réinitialiser par programmation à 0. Lorsque je lance la command ci-dessous, il ne réinitialise pas l'index de segment à 0 comme prévu. Au lieu de cela, il met en évidence le segment indexé 1.

[seg setSelectedSegmentIndex:0]; 

Bizarrement quand je connecte le segment sélectionné, il renvoie 0 .

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

setSelectedSegmentIndex:0 , après l'exécution de setSelectedSegmentIndex:0 je ne peux pas resélectionner le segment 0 manuellement au toucher, il semble être verrouillé sur le segment 1, jusqu'à ce que j'appuie sur 1 dans lequel il fonctionne normalement.

Voici la configuration du button:

  itemArray = [NSMutableArray arrayWithObjects: @"Zero", @"One", 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]; 

NOTE: Pour réécrire ce que j'essayais d'accomplir avec cette question: Je veux définir l'index sélectionné d'UISegmentedControl via une variable dynamicment, get le feedback visuel approprié, et vérifier l'index sélectionné dans une méthode, pour faire quelque chose en fonction de la sélection indice. Voir ma réponse ci-dessous pour une solution.

Changer dans viewDidLoad:

 [seg setSelectedSegmentIndex:index]; 

vous changez utiliser la valeur de l'index comme vous le souhaitez.

À partir du code, vous pouvez simplement faire seg.selectedSegmentIndex = someDefaultIndex .

Si vous devez le définir dans viewDidLoad: ou non dépend entièrement de la structure de votre application. Par exemple, si votre application démarre et charge la vue pour la première fois et doit définir le contrôle à la valeur qu'elle avait lors de la précédente exécution de l'application, il est donc logique de le faire à cet endroit.

Cela permet de sortinger le segment sélectionné, en termes de feedbak visuel, c'est-à-dire qu'après avoir programmé le segment sélectionné, les segments seront correctement teints.

 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]]; } } 

Pour répéter ce que j'essayais d'accomplir avec cette question: Je veux définir l'index sélectionné d'UISegmentedControl via une variable dynamicment, get le return visuel approprié, et vérifier l'index sélectionné dans une méthode, pour faire quelque chose en fonction de l'index sélectionné.

A l'origine je devinais que c'est aussi simple que: mySegmentedController.selectedSegmentIndex = someIndex, puis test pour l'index. Mais comme indiqué dans ma question, cela ne fonctionnait pas pour moi. Le comportement est impair. Après l'exécution de ce code, le button approprié ne serait pas en surbrillance.

Voici un projet où je l'ai réparé, donc ça marche. Je ne sais pas exactement pourquoi cela fonctionne. Peut-être un timeout que j'ai mis dedans, avant de régler l'index. Je vais mettre à jour et commenter le file de projet si je peux l'affiner.

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

AVERTISSEMENT: Ceci ne répond pas tout à fait à la question, mais est étroitement lié.

J'ai eu un problème similaire. La plupart du time, mon UISegmentedController fonctionnait bien. Il a 4 segments, Off, 30, 60 et 120.

À des intervalles randoms (normalement juste avant une version !!), le segment Off devient non sélectionnable à partir de l'interface user. (Je n'ai pas essayé de le sélectionner à partir du code parce que ce n'est pas ce que je dois faire et ne résoudra pas mon problème.)

La solution est de supprimer ce UISegmentedController de mon XIB et le replace par un nouveau (et exactement identique) qui fonctionne alors très bien.

J'ai même CMD-C et CMD-V'd UISegmentedController incriminé dans XIB d'une autre application. Et le segment Off (c'est-à-dire celui à l'index 0) n'était pas sélectionnable dans ce XIB aussi.

Cela semble être un problème avec XCode.

Swift 3.0

 segmentedControl.selectedSegmentIndex = #your value#