Transición UIViewController – objective-c

Tengo UIViewControllers A y B, están asignados en AppDelegate . Necesito aplicar transición a ellos. ¿Cómo transitarlos sin reasignar y replace UIViews ? Este código llama desde mi UIBarButtonItem en UINavigationController :

 [UIView transitionFromView:self.view //UIViewController A toView:appDelegate.secondViewController.view //UIViewController B duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft 

Este método reemplaza a UIViews en UIViewControllers , y puedo volver a transitarlos, o simplemente no sé cómo hacerlo. ¿Me puede decir cómo hacer esto?

Si estás en el mundo de iOS 5 y quieres saltar entre varios controlleres de vista, es posible que desees continuar con el control de View Controller . O vea la session 102 de WWDC 2011 .

Ver la contención del controller básicamente supone que tiene un controller de vista principal que gobierna la navigation entre varios controlleres secundarios. En su caso, la vista principal sería una con la barra de navigation con el button en él.

Actualizar:

Si busca contención, puede crear un controller de vista padre que tenga una barra de navigation con el button en él. Cuando carga esa vista, puede agregar la primera vista secundaria. Por viewDidLoad tanto, viewDidLoad podría parecerse a:

 - (void)viewDidLoad { [super viewDidLoad]; // this is my model, where I store data used by my view controllers _model = [[MyModel alloc] init]; // let's create our first view controller OneViewController *controller = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; // pass it our model (obviously, `model` is a property that I've set up in my child controllers) controller.model = _model; // let's put the new child in our container and add it to the view [self addChildViewController:controller]; [self configureChild:controller]; [self.view addSubview:controller.view]; [controller didMoveToParentViewController:self]; // update our navigation bar title and the label of the button accordingly [self updateTitles:controller]; } 

El configureChild simplemente hace la configuration final. Como cuestión de conveniencia, con frecuencia tendré una UIView que he configurado en IB (en este caso, denominada childView ) que utilizo para configurar el marco, lo que me saca del mundo de la creación manual de frameworks, pero puedes hacerlo como quieras:

 - (void)configureChild:(UIViewController *)controller { // configure it to be the right size (I create a childView in IB that is convenient for setting the size of the views of our child view controllers) controller.view.frame = self.childView.frame; } 

Esta es la acción si toca el button en la barra de navigation. Si está en el primer controller, configure el segundo controller. Si está en el segundo controller, configure el primero:

 - (IBAction)barButtonTouchUpInside:(id)sender { UIViewController *currentChildController = [self.childViewControllers objectAtIndex:0]; if ([currentChildController isKindOfClass:[OneViewController class]]) { TwoViewController *newChildController = [[TwoViewController alloc] initWithNibName:@"TwoViewController" bundle:nil]; newChildController.model = _model; [self transitionFrom:currentChildController To:newChildController]; } else if ([currentChildController isKindOfClass:[TwoViewController class]]) { OneViewController *newChildController = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; newChildController.model = _model; [self transitionFrom:currentChildController To:newChildController]; } else NSAssert(FALSE, @"Unknown controller type"); } 

Esto hace la transición básica (incluidas las diversas llamadas relacionadas con la contención):

 - (void)transitionFrom:(UIViewController *)oldController To:(UIViewController *)newController { [self addChildViewController:newController]; [self configureChild:newController]; [self transitionFromViewController:oldController toViewController:newController duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self updateTitles:newController]; } completion:^(BOOL finished){ [oldController willMoveToParentViewController:nil]; [oldController removeFromParentViewController]; [newController didMoveToParentViewController:self]; }]; } 

Este método simplemente configura el título en la barra de navigation en nuestro controller de vista principal según el niño seleccionado. También configura el button para hacer reference al otro controller.

 - (void)updateTitles:(UIViewController *)controller { if ([controller isKindOfClass:[OneViewController class]]) { self.navigationItemTitle.title = @"First View Controller"; // current title self.barButton.title = @"Two"; // title of button to take me to next controller } else if ([controller isKindOfClass:[TwoViewController class]]) { self.navigationItemTitle.title = @"Second View Controller"; // current title self.barButton.title = @"One"; // title of button to take me to next controller } else NSAssert(FALSE, @"Unknown controller type"); } 

Todo esto supone que vas a crear y destruir controlleres a medida que saltas entre ellos. Generalmente hago esto, pero uso un object model para almacenar mis datos, así que guardo todos los datos que deseo.

Dijiste que no quieres hacer esto "sin reasignar y replace UIViews": si es así, también puedes cambiar el código anterior para crear los controlleres de vista secundaria por adelantado y cambiar la transición para que simplemente salte entre ellos:

 - (void)viewDidLoad { [super viewDidLoad]; // this is my model, where I store data used by my view controllers _model = [[MyModel alloc] init]; // let's create our first view controller _controller0 = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; _controller0.model = _model; [self addChildViewController:_controller0]; [self configureChild:_controller0]; [_controller0 didMoveToParentViewController:self]; // let's create our second view controller _controller1 = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; _controller1.model = _model; [self addChildViewController:_controller1]; [self configureChild:_controller1]; [_controller1 didMoveToParentViewController:self]; // let's add the first view and update our navigation bar title and the label of the button accordingly _currentChildController = _controller0; [self.view addSubview:_currentChildController.view]; [self updateTitles:_currentChildController]; } - (void)transitionFrom:(UIViewController *)oldController To:(UIViewController *)newController { [self transitionFromViewController:oldController toViewController:newController duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self updateTitles:newController]; } completion:^(BOOL finished){ _currentChildController = newController; }]; } - (IBAction)barButtonTouchUpInside:(id)sender { UIViewController *newChildController; if ([_currentChildController isKindOfClass:[OneViewController class]]) { newChildController = _controller1; } else if ([_currentChildController isKindOfClass:[TwoViewController class]]) { newChildController = _controller0; } else NSAssert(FALSE, @"Unknown controller type"); [self transitionFrom:_currentChildController To:newChildController]; } 

Lo he visto en ambos sentidos, por lo que puedes hacer lo que sea que funcione para ti.

por favor vea aquí . Básicamente quiere implementar la contención de UIViewController, que es una nueva característica en iOS5. El enlace proporcionado anteriormente proporciona un código y un enlace a un proyecto github.

Buena suerte

t

Encontré una solución para mi problema. Este código funciona en iOS 4.x

 [UIView beginAnimations:@"transition" context:nil]; [UIView setAnimationDuration:1.0]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.navigationController.view cache:NO]; [self.navigationController pushViewController:self.alternateView animated:NO]; [UIView commitAnimations]; 

tratar

 UIViewController* controller1; UIViewController* controller2; [controller1 transitionFromViewController:controller1 toViewController:controller2 duration:0.5f options:0 animations:nil completion:nil]; 

o

si en la parte superior del controller de navigation – controller1 entonces

 UINavigationController* nav; [nav pushViewController:controller2 animated:YES];