Pregunta

En pocas palabras: Quiero tener dos vistas de pantalla completa, donde puedo cambiar entre la vista A y B. Vista Sé que sólo pudiera utilizar un controlador de barra de pestañas, pero yo no quiero. Quiero ver cómo se hace esto con la mano, para el aprendizaje de lo que está pasando bajo el capó.

Tengo una UIViewController que actúa como un controlador de raíz:

@interface MyRootController : UIViewController {
    IBOutlet UIView *contentView;
}
@property(nonatomic, retain) UIView *contentView;

@end

El contentView está conectado a un UIView que he añadido como un subvista a la "vista" de la punta. Esto tiene el color verde y lo veo a pantalla completa. Funciona bien.

A continuación, he creado dos controladores Ver otros más o menos la misma manera. ViewControllerA y ViewControllerB. ViewControllerA tiene un fondo azul, ViewControllerB tiene un fondo negro. Sólo para ver la que está activa.

Así que, en la ejecución de myRootController, hago esto:

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    ViewControllerA *vcA = [[ViewControllerA alloc] initWithNib];
    [self.contentView addSubview:vcA.view];

    [cvA release];
}

Por cierto, el método -initWithNib se parece a esto:

- (id)initWithNib { // Load the view nib
    if (self = [super initWithNibName:@"ViewA" bundle:nil]) {
        // do ivar initialization here, if needed
    }
    return self;
}

Eso funciona. Veo la vista desde ViewControllerA cuando inicio la aplicación. Pero ahora la gran pregunta es: un controlador Vista general tiene todos esos métodos como:

  • (void) viewWillAppear: (BOOL) animada;
  • (void) viewDidDisappear: (BOOL) animada;
  • (void) viewDidLoad;

... y así sucesivamente. ¿Quién o qué, o cómo se llaman esos métodos si lo hago "mi" camino sin un controlador de la barra de pestañas? Es decir: si asigno esa clase de ViewController y la vista de conseguir visibles, tendría que tener cuidado en llamar a esos métodos? ¿Cómo sabe que viewWillAppear, viewDidDisappear o viewDidLoad? Creo que el controlador de barra de pestañas tiene todo esto "inteligencia" bajo el capó. O estoy equivocado?

ACTUALIZACIÓN: Lo he probado. Si libero el controlador de vista (por ejemplo: ViewControllerA), no recibo ningún mensaje de registro en viewDidDisappear. Sólo al asignar e inicializar el ViewControllerA, consigo un viewDidLoad. Pero eso es todo. Así que todas las señales de pie para la inteligencia de UITabBarController ahora;?) Y tengo que encontrar la manera de replicar que, a la derecha

¿Fue útil?

Solución

Usted puede comenzar desde los más simples removeFromSuperview / insertSubview y añadir código a ella poco a poco.


//SwitchViewController.h
#import 
@class BlueViewController;
@class YellowViewController;

@interface SwitchViewController : UIViewController {
    IBOutlet BlueViewController *blueViewController;
    IBOutlet YellowViewController *yellowViewController;
}
- (IBAction)switchViews:(id)sender;
@property (nonatomic, retain) BlueViewController *blueViewController;
@property (nonatomic, retain) YellowViewController *yellowViewController;
@end

//1. remove yellow view and insert blue view
- (IBAction)switchViews:(id)sender {
    if(self.blueViewController.view.superview == nil)
    {
        [yellowViewController.view removeFromSuperview];
        [self.view insertSubview:blueViewController.view atIndex:0];
    }
}

//2. appear=insert, disappear=remove
if(blueViewController.view.superview == nil)
{
    [blueViewController viewWillAppear:YES];
    [yellowViewController viewWillDisappear:YES];

    [yellowViewController.view removeFromSuperview];
    [self.view insertSubview:self.blueViewController.view atIndex:0];

    [yellowViewController viewDidDisappear:YES];
    [blueViewController viewDidAppear:YES];
}

//3. now add animation
[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//blue view will appear by flipping from right
if(blueViewController.view.superview == nil)
{
    [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight 
                            forView:self.view cache:YES];

    [blueViewController viewWillAppear:YES];
    [yellowViewController viewWillDisappear:YES];

    [yellowViewController.view removeFromSuperview];
    [self.view insertSubview:self.blueViewController.view atIndex:0];

    [yellowViewController viewDidDisappear:YES];
    [blueViewController viewDidAppear:YES];
}
[UIView commitAnimations];

Otros consejos

Hay un buen ejemplo de cambiar de vista en el capítulo 6 de partir iPhone Desarrollo. Se puede ver el código fuente de aquí: http://iphonedevbook.com/

SwitchViewController tiene el código para cambiar las vistas mediante programación.


- (IBAction)switchViews:(id)sender
{

    if (self.yellowViewController == nil)
    {
        YellowViewController *yellowController = [[YellowViewController alloc]
                initWithNibName:@"YellowView" bundle:nil];
        self.yellowViewController = yellowController;
        [yellowController release];
    }

    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:1.25];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    UIViewController *coming = nil;
    UIViewController *going = nil;
    UIViewAnimationTransition transition;

    if (self.blueViewController.view.superview == nil) 
    {   
        coming = blueViewController;
        going = yellowViewController;
        transition = UIViewAnimationTransitionFlipFromLeft;
    }
    else
    {
        coming = yellowViewController;
        going = blueViewController;
        transition = UIViewAnimationTransitionFlipFromRight;
    }

    [UIView setAnimationTransition: transition forView:self.view cache:YES];
    [coming viewWillAppear:YES];
    [going viewWillDisappear:YES];
    [going.view removeFromSuperview];
    [self.view insertSubview: coming.view atIndex:0];
    [going viewDidDisappear:YES];
    [coming viewDidAppear:YES];

    [UIView commitAnimations];

}

Si he entendido bien, lo que está tratando de lograr es bastante sencillo.

Sólo tiene que añadir un UINavigationController delegado en su aplicación y hacer:

[navigationController pushView:vcA];

Los delegados serán llamados en consecuencia:

  • (void) viewWillAppear: (BOOL) animada;
  • (void) viewDidDisappear: (BOOL) animada;
  • (void) viewDidLoad;

Y cuando se quiere hacer estallar la vista y empujar otra:

[navigationController popViewControllerAnimated:true];
[navigationController pushView:vcB];

Si no desea que el navigationController mostrando sólo tiene que utilizar:

[navigationBar setHidden:YES];

¿Dónde está la navigationbar UINavigationBar correspondiente a sus UINavigationController.

Esto puede ser un problema antiguo, pero recientemente me encontré con el mismo problema y tenía un tiempo difícil encontrar algo que funcionara. Yo quería cambiar entre dos controladores de vista complementarios, pero quería el cambio a ser animado (construido en animaciones funcionar bien), y yo quería que fuera compatible con guiones gráficos, si es posible.

Para tomar ventaja de transición incorporado, de UIView +transitionFromView:toView:duration:options:completion: método funciona muy bien. Sin embargo, sólo las transiciones entre los puntos de vista, no se ven los controladores.

Para que la transición sea entre los controladores de vista conjunto, no sólo puntos de vista, creando un UIStoryboardSegue personalizada es el camino a seguir. Aun cuando no se utiliza guiones gráficos, este enfoque permite encapsular toda la transición y gestionar el paso de la información relevante de un controlador de vista a la siguiente. Es sólo implica subclases UIStoryboardSegue y anulando un único método, -perform.

Para una implementación de referencia, ver RAFlipReplaceSegue , segue a medida exacta que arme el uso de este enfoque. Como beneficio adicional, sino que también sustituye al antiguo controlador de vista con el nuevo si está en una pila UINavigationController.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top