2012-03-15 2 views
2

Je construis une application qui a actuellement 3 ViewControllers. L'un d'entre eux est utilisé après une connexion réussie et n'est donc pas pertinent dans cette question. J'utilise un mélange de Storyboards et de construction de choses par programmation quand je trouve que les Storyboards ne me donnent pas le contrôle précis dont j'ai besoin.Retour au premier ViewController from second ViewController

Le premier ViewController est construit dans mon 'MainStoryboard'. Il a un formulaire de connexion et un bouton d'information en bas. Je le lier le mon AppDelegate en procédant comme suit à l'intérieur didFinishLaunchingWithOptions:

ViewController *viewController = (ViewController *)self.window.rootViewController; 

Parce que je voulais forcer le rendu d'un UIWebView (une autre histoire) Je crée la deuxième vue par programme. Je fais ce qui suit à l'intérieur didFinishLaunchingWithOptions:

infoViewController = [[InfoViewController alloc] init]; 
[infoViewController view]; 

A l'intérieur de mes deux ViewControllers je configurer un lien vers appDelegate comme ci-dessous:

appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

J'ai un bouton d'information dans mon premier ViewController qui vous emmène à le infoViewController. Il appelle le code suivant quand on tape:

appDelegate.infoViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:appDelegate.infoViewController animated:YES]; 

Les travaux ci-dessus très bien pour moi, flips sur l'écran et affiche le InfoViewController.

Sur mon InfoViewController, j'ai un bouton qui devrait vous ramener à la page de connexion, j'ai essayé toutes sortes de choses pour que cela fonctionne mais il bloque mon application. Rien ne semble fonctionner. Je l'ai essayé ce qui suit:

appDelegate.viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:appDelegate.viewController animated:YES]; 

et

[self.navigationController popToRootViewControllerAnimated:YES]; 

et

[self.navigationController popViewControllerAnimated:YES]; 

et

[self.navigationController popToViewController:appDelegate.viewController animated:YES]; 

Je soupçonne que le dernier 3 pourrait être plus à voir avec quand vous avoir un contrôleur de vue de navigation et vous veux revenir à la racine? Je ne suis pas sûr, mais de toute façon ça ne marche pas. Je l'ai eu en utilisant des storyboards précédemment, donc je suis sûr que ça devrait être facile! Comme mentionné précédemment, je suis passé à la création d'infoViewController par programme afin que je puisse forcer le rendu UIWebView avant l'affichage de la vue.

Toute aide très appréciée.

+0

Je pense que les réponses de dismissModalViewController ci-dessous sont correctes. Sur une note de côté, qu'est-ce que vous accomplissez avec [vue infoViewController]; ?? En outre, vous pouvez configurer le style de transition de ce contrôleur lorsque vous le créez. – danh

+0

Salut, je vais essayer les suggestions ci-dessous un peu plus tard (fin de ma pause déjeuner et retour à mon emploi de jour PHP/JS). La vue [infoViewController] affiche littéralement un UIWebView contenant des informations sur l'application. Je soupçonne que peut-être vous pensez que je devrais juste montrer cette information dans une autre vue dans le premier ViewController? Je n'ai vraiment fait que ObjC/iOS pendant 3-4 semaines donc il est probable que je ne suis pas entièrement conforme aux meilleures pratiques. –

+0

Gotcha, mais la vue est juste une propriété de ViewController. C'est la vue qui est gérée par le contrôleur de vue ... pas un verbe, mais un nom. Je pense que c'est nul au moment où vous le demandez. (Il peut provoquer un changement d'état la première fois que le contrôleur de vue a été chargé à partir d'une plume, ce qui revient à effectuer le premier chargement paresseux de la vue, mais vous n'avez généralement pas à vous en soucier. . Essayez de commenter cette ligne et voyez si elle ne se comporte pas de la même façon. – danh

Répondre

6

Vous pouvez faire avec:

[self dismissModalViewControllerAnimated:YES]; 
+0

Merci beaucoup :) –

5

Vous devriez utiliser.

[self dismissModalViewControllerAnimated:YES]; 
+0

Merci beaucoup :) –

1

Vous devez utiliser un contrôleur principal pour basculer entre vos autres contrôleurs de vue. Changez la vue de votre contrôleur de racine à un de vos autres contrôleurs de vue (appliquez des animations comme d'habitude si nécessaire).Maintenez un pointeur sur votre contrôleur racine dans vos autres contrôleurs de vue et appelez self.rootController.view = <desired_controller_instance>.view

0

Je pense que la façon dont vous présentez votre InfoViewController est erronée. Faites-la manière suivante:

Dans votre ViewController, créer une action pour le bouton info .:

- (IBAction)infoButtonTapped:(id)sender 
{ 
    InfoViewController *infoViewController = [[InfoViewController alloc] init]; 
    infoViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:infoViewController animated:YES]; 
} 

Et dans votre InfoViewController, dans l'action de votre bouton que cela devrait vous prendre écrire de nouveau:

- (void)takeBackToViewController 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Espérons que cela fonctionne.

0

dans le contrôleur présenté également vous pouvez utiliser cette

if(self.parentViewController) 
    [self.parentViewController dismissModalViewControllerAnimated:YES]; 
else 
    [self.presentingViewController dismissModalViewControllerAnimated:YES]; 

Pour dissmiss contrôleur de courant.

Questions connexes