web-dev-qa-db-fra.com

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, comme le fait Apple dans l'App Store lorsque vous basculez entre 'Top Paid' et 'Top Free '.

80
Mark Adams

L'approche la plus simple consiste à disposer de deux vues sur lesquelles vous pouvez basculer leur visibilité pour indiquer quelle vue a été sélectionnée. Voici un exemple de code sur la façon de le faire. Ce n'est certainement pas une façon optimisée de gérer les vues, mais juste de montrer comment vous pouvez utiliser le ISegmentControl 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 vue de droite.

111
Ronnie Liew

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

J'ai essayé plusieurs solutions et aucune d'entre elles ne fonctionnait pour moi, ou fonctionnait de manière erratique, spécialement avec le titleView de la barre de navigation ne montrant pas toujours le segmentedControl lors du transfert de vues.

J'ai trouvé ce billet de blog sur le problème qui explique comment le faire correctement. Il semble qu'il ait eu recours à Apple ingénieurs de la WWDC 2010 afin de proposer cette solution.

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

La solution dans ce lien est sans conteste la meilleure solution que j'ai trouvée à ce sujet jusqu'à présent. Avec un peu d’ajustement, cela fonctionnait également bien avec un TabBar en bas

45
Marc M

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.

17
lostInTransit

Essayez ce code, cela vous aidera à basculer entre différentes vues sur des segments changeants de segment.

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

7
Soniya

Une idée est que la vue avec les contrôles segmentés ait une vue de conteneur que vous remplissez avec les différentes sous-vues (ajoutez-la en tant que sous-vue unique de la vue de conteneur lorsque les segments sont basculés). Vous pouvez même avoir des contrôleurs de vue distincts pour ces sous-vues, bien que vous deviez transmettre des méthodes importantes telles que "viewWillAppear" et "viewWillDisappear" si vous en avez besoin (et vous devrez leur indiquer le contrôleur de navigation sous lequel elles se trouvent).

Généralement, cela fonctionne plutôt bien parce que vous pouvez disposer la vue principale avec le conteneur dans IB, et que les sous-vues occupent tout l’espace que le conteneur leur laisse (assurez-vous que vos masques de taille automatique sont configurés correctement).

Essayez d’utiliser SNFSegmentedViewController , un composant open source qui fait exactement ce que vous recherchez avec une configuration telle que UITabBarController.

3
sethfri

Attribuer .H dans

 UISegmentedControl *lblSegChange;

- (IBAction)segValChange:(UISegmentedControl *) sender

Déclarer .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];
 }
} 
2
Anbu.Karthik

Version rapide:

Le contrôleur de vue parent est responsable de la définition de la taille et de la position de la vue de chaque contrôleur de vue enfant. La vue du contrôleur de vue enfant devient une partie de la hiérarchie de vue du contrôleur de vue parent.

Définir les propriétés paresseuses:

private lazy var summaryViewController: SummaryViewController = {
   // Load Storyboard
   let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

   // Instantiate View Controller
   var viewController = storyboard.instantiateViewController(withIdentifier: "SummaryViewController") as! SummaryViewController

   // Add View Controller as Child View Controller
   self.add(asChildViewController: viewController)

   return viewController
}()

private lazy var sessionsViewController: SessionsViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "SessionsViewController") as! SessionsViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

Afficher/masquer les contrôleurs de vue enfant:

private func add(asChildViewController viewController: UIViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private func remove(asChildViewController viewController: UIViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

Gérer SegmentedControl tapEvent

private func updateView() {
    if segmentedControl.selectedSegmentIndex == 0 {
        remove(asChildViewController: sessionsViewController)
        add(asChildViewController: summaryViewController)
    } else {
        remove(asChildViewController: summaryViewController)
        add(asChildViewController: sessionsViewController)
    }
}

Et bien sûr, vous pouvez utiliser dans votre classe de contrôleur de vue enfant:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("Summary View Controller Will Appear")
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    print("Summary View Controller Will Disappear")
}

Référence: https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/

2
SlavisaPetkovic

À partir 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
2
Envil

n rapide Swift Version:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
1
Bright Future