Question

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 lorsque vous passez de "Top Paid" à "Top Free".

Était-ce utile?

La solution

La méthode la plus simple consiste à disposer de deux vues que vous pouvez basculer entre elles 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 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 modifier le code pour masquer / afficher la vue de droite.

Autres conseils

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, en particulier avec le titleView de la barre de navigation ne montrant pas toujours le segmentedControl lors de l’affichage poussé / affiché.

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

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

La solution proposée dans ce lien est sans conteste la meilleure solution que j’ai trouvée sur le problème jusqu’à présent. Avec un peu d’ajustement, cela fonctionnait bien avec une barre de tabulation 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 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 transférer des méthodes importantes comme & "ViewWillAppear &"; et " viewWillDisappear " si vous en avez besoin (et il faudra leur dire quel contrôleur de navigation ils utilisent).

En général, cela fonctionne plutôt bien car vous pouvez disposer la vue principale avec le conteneur dans IB, et les sous-vues occuperont tout l'espace que leur laissera le conteneur (assurez-vous que vos masques de taille automatique sont correctement configurés).

Essayez ce code, cela vous aidera à passer d’une vue à l’autre en changeant de segment de segment.

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

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

À 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

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

Version Swift:

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 vues du contrôleur de vue parent.

Définissez 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 vos classes 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 /

Une version rapide de Swift:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top