¿Cómo uso un UISegmentedControl para cambiar las vistas?

Estoy tratando de averiguar cómo usar los diferentes estados de un UISegmentedControl para cambiar las vistas, similar a cómo Apple lo hace en App Store al cambiar entre 'Top Paid' y 'Top Free'.

El enfoque más simple es tener dos vistas para que pueda alternar su visibilidad para indicar qué vista ha sido seleccionada. Aquí hay un código de ejemplo sobre cómo se puede hacer, definitivamente no es una forma optimizada de manejar las vistas, sino simplemente para demostrar cómo se puede usar UISegmentControl para alternar la vista 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]; } } 

Por supuesto, puede volver a factorizar el código para ocultar / mostrar la vista correcta.

En mi caso, mis puntos de vista son bastante complejos y no puedo cambiar la propiedad oculta de diferentes vistas, ya que tomaría demasiada memory.

He probado varias soluciones y ninguna de ellas funcionó para mí, o se ejecutó de forma errática, especialmente con el títuloView de la barra de navigation no siempre mostrando el control segmentado al pulsar / abrir vistas.

Encontré esta publicación de blog sobre el tema que explica cómo hacerlo de la manera adecuada. Parece que tuvo la ayuda de ingenieros de Apple en WWDC'2010 para llegar a esta solución.

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

La solución en este enlace es la mejor solución que he encontrado sobre el tema hasta el momento. Con un poco de ajuste también funcionó bien con un tabBar en la parte inferior

O si es una tabla, puede volver a cargar la tabla y en cellForRowAtIndex, rellene la tabla desde diferentes orígenes de datos según la opción de segmento seleccionada.

Una idea es que la vista con los controles segmentados tenga una vista de contenedor que llene con las diferentes subvistas (agregue como una única subvista de la vista de contenedor cuando los segmentos se alternan). Incluso puede tener controlleres de vista separados para esas subvistas, aunque debe reenviar methods importantes como "viewWillAppear" y "viewWillDisappear" si los necesita (y deberán saber qué controller de navigation están bajo).

En general, esto funciona bastante bien porque puedes diseñar la vista principal con el contenedor en IB, y las subvistas llenarán el espacio que el contenedor les permita tener (asegúrate de que las máscaras autorizadas estén configuradas correctamente).

Pruebe este código, esto le ayudará a cambiar entre diferentes vistas sobre el cambio de segmentos de control de segmentos

Abrir diferentes vistas al seleccionar diferentes segmentos de UISegmentControl

Intente utilizar SNFSegmentedViewController , un componente de código abierto que hace exactamente lo que está buscando con una configuration como UITabBarController .

De la respuesta de @Ronnie Liew, creo esto:

 // // 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 

Asigne .H en

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

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

Una versión rápida de Swift:

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