Comment utiliser un UISegmentedControl pour changer de vue?

J'essaie de comprendre comment utiliser les différents états d'un UISegmentedControl pour changer de vue, de la même manière qu'Apple le fait dans l'App Store quand il change entre 'Top Paid' et 'Top Free'.

L'approche la plus simple consiste à avoir deux vues que vous pouvez changer de visibilité pour indiquer quelle vue a été sélectionnée. Voici un exemple de code sur la façon dont cela peut être fait, certainement pas un moyen optimisé pour gérer les vues, mais juste pour démontrer comment vous pouvez utiliser UISegmentControl pour basculer la vue visible:

- (IBAction)segmentSwitch:(id)sender { UISegmentedControl *segmentedControl = (UISegmentedControl *) sender; NSInteger selectedSegment = segmentedControl.selectedSegmentIndex; if (selectedSegment == 0) { //toggle the correct view to be visible [firstView setHidden:NO]; [secondView setHidden:YES]; } else{ //toggle the correct view to be visible [firstView setHidden:YES]; [secondView setHidden:NO]; } } 

Vous pouvez bien sûr redéfinir le code pour masquer / afficher la bonne vue.

Dans mon cas, mes vues sont assez complexes et je ne peux pas simplement changer la propriété cachée de différentes vues parce que cela prendrait trop de memory.

J'ai essayé plusieurs solutions et aucune d'elles n'a fonctionné pour moi, ou exécutée de manière erratique, spécialement avec le titleView de la NavBar ne montrant pas toujours le segmentedControl lorsque je pousse / ouvre des vues.

J'ai trouvé ce blog sur le problème qui explique comment le faire correctement. Il semble avoir eu l'aide des ingénieurs d'Apple à la WWDC'2010 pour find cette solution.

http://redartisan.com/2010/6/27/ cruisegmented-control-view-switching-revisited

La solution dans ce lien est de loin la meilleure solution que j'ai trouvé sur le problème jusqu'à présent. Avec un peu d'ajustement, il a également bien fonctionné avec un tabBar en bas

Ou si c'est une table, vous pouvez recharger la table et dans cellForRowAtIndex, remplir la table à partir de différentes sources de données en fonction de l'option de segment sélectionnée.

Une idée consiste à faire en sorte que la vue avec les controls segmentés ait une vue de conteneur que vous remplissez avec les différentes sous-vues (à append en tant que sous-vue unique de la vue de conteneur lorsque les segments sont basculés). Vous pouvez même avoir des controllers de vue séparés pour ces sous-vues, bien que vous deviez transférer des methods importantes comme "viewWillAppear" et "viewWillDisappear" si vous en avez besoin (et ils devront être informés du controller de navigation sous lequel ils se trouvent).

Généralement, cela fonctionne plutôt bien car vous pouvez disposer la vue principale avec le conteneur dans IB, et les sous-vues rempliront l'espace que le conteneur leur laisse (assurez-vous que vos masques autoresize sont correctement configurés).

Essayez ce code, Cela vous aidera à basculer entre différentes vues sur les segments de modification de Segment COntrol

Ouvrir différentes vues sur la sélection de différents segments de UISegmentControl

Essayez d'utiliser SNFSegmentedViewController , un composant open-source qui fait exactement ce que vous searchz avec une configuration comme UITabBarController .

De la réponse de @Ronnie Liew, je crée ceci:

 // // ViewController.m // ResearchSegmentedView // // Created by Ta Quoc Viet on 5/1/14. // Copyright (c) 2014 Ta Quoc Viet. All rights reserved. // #define SIZE_OF_SEGMENT 56 #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize theSegmentControl; UIView *firstView; UIView *secondView; CGRect leftRect; CGRect centerRect; CGRect rightRect; - (void)viewDidLoad { [super viewDidLoad]; leftRect = CGRectMake(-self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); centerRect = CGRectMake(0, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); rightRect = CGRectMake(self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); firstView = [[UIView alloc] initWithFrame:centerRect]; [firstView setBackgroundColor:[UIColor orangeColor]]; secondView = [[UIView alloc] initWithFrame:rightRect]; [secondView setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:firstView]; [self.view addSubview:secondView]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)segmentSwitch:(UISegmentedControl*)sender { NSInteger selectedSegment = sender.selectedSegmentIndex; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.2]; if (selectedSegment == 0) { //toggle the correct view to be visible firstView.frame = centerRect; secondView.frame = rightRect; } else{ //toggle the correct view to be visible firstView.frame = leftRect; secondView.frame = centerRect; } [UIView commitAnimations]; } @end 

Atsortingbuer .H dans

  UISegmentedControl *lblSegChange; - (IBAction)segValChange:(UISegmentedControl *) sender 

Déclarez .M

 - (IBAction)segValChange:(UISegmentedControl *) sender { if(sender.selectedSegmentIndex==0) { viewcontroller1 *View=[[viewcontroller alloc]init]; [self.navigationController pushViewController:view animated:YES]; } else { viewcontroller2 *View2=[[viewcontroller2 alloc]init]; [self.navigationController pushViewController:view2 animated:YES]; } } 

Une version rapide de Swift:

 @IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) { if segmentControl.selectedSegmentIndex == 0 { // do something } else { // do something else } }