Cambiar a controller de vista principal desde el controller de vista secundaria – iOS

Tengo un Controlador de vista de acciones principal, y en eso hay un button "Revisar". La funcionalidad del button de revisión es:

- (IBAction)btnReview:(id)sender { ReviewViewController *vc = [[ReviewViewController alloc]initWithNibName:@"ReviewViewController" bundle:nil]; [self addChildViewController:vc]; [vc didMoveToParentViewController:self]; [self.view addSubview:vc.view]; } 

Ahora en Review Page, tengo un button. Y en la acción de ese button, quiero volver a Parent View Controller. Su vista se debe mostrar. He intentado seguir el código, hace una pausa o bloquea la aplicación.

 [self didMoveToParentViewController:nil]; [self.view removeFromSuperview]; [self removeFromParentViewController]; 

Incluso lo intenté:

 [self dismissModalViewControllerAnimated:YES] 

También he leído otras publicaciones relacionadas con esta pregunta, pero no he podido encontrar una respuesta satisfactoria. ¡Por favor ayuda!

Estoy asumiendo que este es un contenedor custom viewcontroller que está tratando de build, "self" es el viewController de las acciones principales del que habla.

Prueba esto:

 - (IBAction)btnReview:(id)sender { ReviewViewController *vc = [[ReviewViewController alloc]initWithNibName:@"ReviewViewController" bundle:nil]; [self addChildViewController:vc]; [self.view addSubview:vc.view]; [vc didMoveToParentViewController:self]; vc = nil; } 

Para el button "Atrás", asumo que este es el button para regresar a Main Actions viewController desde Review viewController, intente esto:

 - (IBAction)btnReviewHide:(id)sender { [self willMoveToParentViewController:nil]; [self.view removeFromSuperview]; [self removeFromParentViewController]; } 

Espero que esto ayude.

Debe usar la delegación. Cuando hace clic en el button en su ReviewViewController , llama a un método como: [self.delegate hideReviewController:self];

Y este método se vería como:

 - (void)hideReviewController:(ReviewViewController *)controller { [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ controller.view.alpha = 0; } completion:^(BOOL finished) { [self.view removeSubview:controller.view]; // If you want the Review Controller to be deallocated: [self removeChildViewController:controller]; }]; } 

EDIT: en su file ReviewDelegate.h agregue:

 @class ReviewViewController; @protocol ReviewDelegate <NSObject> - (void)hideReviewController:(ReviewViewController *)controller; @end 

A continuación, agregue esta propiedad:

 @property (nonatomic, weak) id <ReviewDelegate> delegate; 

En la class padre:

  - (IBAction)btnReview:(id)sender { ReviewViewController *vc = [[ReviewViewController alloc]initWithNibName:@"ReviewViewController" bundle:nil]; vc.delegate = self; [self addChildViewController:vc]; [vc didMoveToParentViewController:self]; [self.view addSubview:vc.view]; } - (void)hideReviewController:(ReviewViewController *)controller { [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ controller.view.alpha = 0; } completion:^(BOOL finished) { [self.view removeSubview:controller.view]; // If you want the Review Controller to be deallocated: [self removeChildViewController:controller]; }]; } 

También sugiero que lea acerca de la delegación

Prueba esto

 self.view=nil; [self willMoveToParentViewController:nil]; [self.view removeFromSuperview]; [self removeFromParentViewController]; 

No es necesario que sea complejo … Simplemente use UINavigationController .

Para navegar de ParentVC a ChildVC :

  ChildViewController *ChildVC = [[ChildViewController alloc]initWithNibName:@"ChildViewController" bundle:nil]; [self.navigationController pushViewController:ChildVC animated:YES]; 

Y para navegar de ChildVC a ParentVC :

 ParentViewController *ParentVC = [[ParentViewController alloc]initWithNibName:@"ParentViewController" bundle:nil]; [self.navigationController popViewControllerAnimated:YES]; 

Dado que está agregando la Vista secundaria como una Subview a Parent, debe hacerlo manualmente desde su supervisión (en su caso, vista de padre). En lugar de agregarlo como una subvista, puede usar el método presentViewController de la siguiente manera:

  - (IBAction)btnReview:(id)sender { ReviewViewController *vc = [[ReviewViewController alloc] initWithNibName:@"ReviewViewController" bundle:nil]; [self presentViewController:vc animated:YES completion:nil]; } 

y en el código de class secundario para el button Atrás será:

  -(IBAction)backButtonClicked:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } 

Parece que lo que estás buscando podría ser atendido con un UINavigationController . Simplemente use pushViewController: para insert la nueva vista en la pantalla. Luego, aparecerá un button de retroceso en la barra de navigation en la parte superior de la vista, que puede usarse para volver al controller de vista "principal".

Vea la documentation .

escribiendo solo

 - (IBAction)backbutton:(id)sender { [self.navigationController popToRootViewControllerAnimated:YES]; } 

trabajado en mi caso