web-dev-qa-db-fra.com

Changer la valeur d'index ou de valeur sélectionnée par UISegmentedControl par programmation

J'ai un UISegmentedControl avec deux segments (index: 0 et 1) que j'essaie de réinitialiser par programme à 0. Lorsque j'exécute la commande 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, lorsque je connecte le segment sélectionné, il retourne 0

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

Également, 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 je tape 1 dans lequel il fonctionne normalement. 

Voici la configuration pour le bouton:

    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 reformuler ce que j'essayais d'accomplir avec cette question: je veux définir l'index sélectionné d'un UISegmentedControl via une variable de manière dynamique, obtenir le retour visuel approprié et vérifier l'index sélectionné dans une méthode pour que quelque chose se produise en fonction de l'index sélectionné. Voir ma réponse ci-dessous pour une solution.

17
Mrwolfy

Changement dans viewDidLoad:

[seg setSelectedSegmentIndex:index];

vous modifiez utilisez la valeur d'index comme vous le souhaitez.

27
Krishnan8190

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

Que vous deviez ou non le définir dans viewDidLoad: 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 sur la valeur qu'il avait lors de l'exécution précédente de l'application, il est alors logique de le faire ici.

1
NewStack

Cela aide à trier le segment sélectionné, en termes de flux visuel, c'est-à-dire qu'après avoir programmé le segment sélectionné par programmation, cela teint les segments correctement. 

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

Pour reformuler ce que j’essayais d’obtenir avec cette question: je veux définir l’index sélectionné d’un UISegmentedControl via une variable de manière dynamique, obtenir le retour visuel approprié et vérifier l’index sélectionné dans une méthode pour que quelque chose se produise en fonction de l’index sélectionné.

À l’origine, j’imaginais que c’était aussi simple que cela: mySegmentedController.selectedSegmentIndex = someIndex, puis testait l’index. Mais comme indiqué dans ma question, cela ne fonctionnait pas pour moi. Le comportement est étrange. Après avoir exécuté ce code, le bouton approprié ne serait pas mis en évidence. 

Voici un projet où je l'ai réparé, donc ça marche. Je ne sais pas exactement pourquoi cela fonctionne. Peut-être un délai que j'ai mis là, avant de définir l'index. Je mettrai à jour et commenterai le fichier de projet si je peux l'affiner. 

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

0
Mrwolfy

Swift 3.0

segmentedControl.selectedSegmentIndex = #your value#
0
Abhishek Jain

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

J'ai eu un problème similaire. La plupart du temps, mon contrôleur UISegmented a fonctionné correctement. Il a 4 segments, Off, 30, 60 et 120.

À des intervalles aléatoires (normalement juste avant une publication !!), le segment Off devient non sélectionnable à partir de l'interface utilisateur. (Je n'ai pas essayé de le sélectionner dans le code, car ce n'est pas ce que je dois faire et cela ne résoudra pas mon problème.)

La solution consiste à supprimer UISegmentedController de mon fichier XIB et à le remplacer par un fichier neuf (et exactement identique) qui fonctionne ensuite correctement.

J'ai même CMD-C et CMD-V ont envoyé le UISegmentedController incriminé dans le XIB d'une autre application. Et le segment Off (c'est-à-dire celui de l'index 0) ne pouvait pas non plus être sélectionné dans ce fichier XIB. 

Cela semble être un problème avec XCode.

0
Nick T