2

J'ai un Contrôleur de Vue Actions principal, et sur cela il y a le bouton "Revoir". La fonctionnalité du bouton Review est:Shift to Parent View Contrôleur du contrôleur de vue enfant - iOS

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

Maintenant sur la page de révision, j'ai un bouton. Et sur l'action de ce bouton, je veux revenir à Parent View Controller. Sa vue devrait être affichée. J'ai essayé le code suivant, il fait une pause ou plante l'application.

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

J'ai même essayé:

[self dismissModalViewControllerAnimated:YES] 

J'ai lu d'autres commentaires à propos de cette question aussi bien mais ne pouvait pas trouver une réponse satisfaisante. S'il vous plaît aidez!

+0

Je ne sais pas si c'est le problème ici, mais vous ne devriez pas avoir à appeler 'didMoveToParentViewController:' avec un paramètre 'nil',' removeFromParentViewController' devrait l'appeler automatiquement après la suppression du contrôleur de vue. – omz

+0

même si je supprime [self didMoveToParentViewController: nil] ;, il interrompt toujours l'application et, plus tard, les plantages. – user2334616

Répondre

0

On dirait que ce que vous cherchez pourrait être pris en charge avec UINavigationController. Utilisez simplement pushViewController: pour afficher la nouvelle vue sur l'écran. Ensuite, un bouton de retour apparaîtra dans la barre de navigation au sommet de la vue, qui peut être utilisé pour revenir au contrôleur de vue "parent". Voir le documentation.

+0

Non, je n'utilise pas UINavigationController, car mon application est basée sur un onglet. – user2334616

+0

Voir la réponse de Levi ci-dessus, alors. –

2

Vous devez utiliser la délégation. Lorsque vous cliquez sur le bouton dans votre ReviewViewController, vous appelez une méthode comme: [self.delegate hideReviewController:self];

Et cette méthode ressemblerait à quelque chose comme:

- (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: Dans votre fichier ReviewDelegate.h ajouter:

@class ReviewViewController; 

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

Puis ajouter cette propriété:

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

Dans la classe parente:

- (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]; 
           }]; 
    } 

Je suggère également que vous lisez sur delegation

1

Vous n'êtes pas obligé de le rendre complexe ... Il suffit d'utiliser UINavigationController.

Pour naviguer ParentVC-ChildVC:

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

Et pour naviguer en arrière ChildVC-ParentVC:

ParentViewController *ParentVC = [[ParentViewController alloc]initWithNibName:@"ParentViewController" bundle:nil]; 

[self.navigationController popViewControllerAnimated:YES]; 
+0

La navigation de ParentVC vers ChildVC fonctionne correctement, mais se bloque lors de la navigation de ChildVC vers ParentVC. – user2334616

+0

Avez-vous implémenté 'pushViewController:' pour la navigation de ParentVC à ChildVC ???? –

+0

Avez-vous implémenté 'UINavigationControllerDelegate' dans votre fichier d'interface de votre parentVC ainsi que dans ChildVC. –

1

Puisque vous ajoutez la vue des enfants en tant que sous-vue sur parent, vous devez manuellement à partir de sa vue d'ensemble (dans votre cas parentview).Plutôt que de l'ajouter en tant que sous-vue, vous pouvez utiliser la méthode presentViewController comme suit:

- (IBAction)btnReview:(id)sender 
    { 

    ReviewViewController *vc = [[ReviewViewController alloc] initWithNibName:@"ReviewViewController" bundle:nil]; 
    [self presentViewController:vc 
         animated:YES 
        completion:nil]; 
    } 

et dans le code de classe enfant pour le bouton de retour sera:

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

Je suppose que cela est un conteneur de viewcontroller personnalisé que vous essayez de créer, "self" est le viewController des actions principales dont vous parlez.

Essayez ceci:

- (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; 

} 

Pour le bouton "Retour", je suppose que c'est le bouton pour revenir aux actions principales viewController de l'examen viewController, essayez ceci:

- (IBAction)btnReviewHide:(id)sender 
{ 

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

} 

J'espère que cela t'aides.

2

Essayez cette

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

écrit seulement

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

a travaillé dans mon cas

Questions connexes