web-dev-qa-db-fra.com

Push View depuis Presented View Controller dans iOS

En bref: Comment puis-je PushViewController à partir de ViewController présenté?

En bref:

J'ai MainViewController, dans lequel j'ai un bouton sur clic de bouton, je présente une vue appelée LoginViewController.

Sur cette page (LoginViewController), j'ai encore button, en cliquant dessus, j'essaie de pousser mon contrôleur de vue (appelé HomeViewController) qu'il ne pousse pas.

Voici mon extrait de code,

MainViewController.m

- (IBAction)LoginClicked:(id)sender {
    LoginViewController *vc = [[LoginViewController alloc] init];
    [self presentViewController:vc animated:YES completion:nil];
}

LoginViewController.m

- (IBAction)buttonActionMethodOnLoginView:(id)sender{
     NSLog(@"viewControllers %@",APPDELEGATE.nav.viewControllers);
     //LoginViewController is not in this array
     HomeViewController *obj = [[HomeViewController alloc] init];
     [self.navigationController pushViewController:obj animated:YES];
}

Mais cela n'a pas fonctionné pour moi. J'ai aussi imprimé a stack of view controllers avant pushed, mais il n'a pas LoginViewController. Donc, sans ajouter LoginViewController dans a stack of view controllers, Comment puis-je pushed à HomeViewController à partir de LoginViewController?

Quand je récupère de HomeViewController, alors LoginViewController devrait s'ouvrir ..

Est-il possible d'utiliser ce single NavigationController?

Remarque: - Ici, je viens de prendre un exemple en utilisant Login, Home et Main ViewController. Mais je veux cela dans d'autres écrans.

25
Meet Doshi

Vous devez Push depuis votre première vue (MainViewController), mais vous pouvez utiliser une animation identique à PresentView et DismissView. Utilisez le code suivant pour cela: -

Pour Push (sur MainViewController)

LoginViewController *VC = [[LoginViewController alloc]init];
CATransition* transition = [CATransition animation];
transition.duration = 0.3f;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
[self.navigationController.view.layer addAnimation:transition
                                            forKey:kCATransition];
[[[UINavigationController alloc] initWithRootViewController:VC] pushViewController:VC animated:NO];
//[self.navigationController pushViewController:VC animated:NO];

Pour Pop (sur LoginViewController)

CATransition* transition = [CATransition animation];
transition.duration = 0.3f;
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition
                                            forKey:kCATransition];
[self.navigationController popViewControllerAnimated:NO];

En utilisant ce code, vous pouvez obtenir une animation identique à Present-Dismiss ViewControllers. Reportez-vous cette réponse pour plus de détails.

Et après cela, vous pouvez utiliser votre code pour PushingLoginViewController à HomeViewController

J'espère que c'est ce que vous recherchez. Toute inquiétude me revient. :)

3
Meet Doshi

salut quand vous présentez votre contrôleur de vue de connexion Présentez simplement un contrôleur de navigation comme:

LoginVC *loginVCObj =[[LoginVC alloc]initWithNibName:@"LoginVC" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVCObj];
[self presentViewController:nav animated:YES completion:nil];

Maintenant, votre PresentedViewController est un navigtioncontroller maintenant vous pouvez simplement pousser vers votre VC domestique

  HomeViewController *obj = [[HomeViewController alloc] init];
 [self.navigationController pushViewController:obj animated:YES];

J'espère que cela vous sera utile

25
Shubham bairagi

LoginViewController ne doit pas être poussé vers la pile du contrôleur de navigation. Permettez-moi de décrire ci-dessous "pourquoi".

Notre MainViewController devrait être sur la pile - vous voulez toujours y retourner.

// AppDelegate.m (only if you don't use storyboards, if you do - you don't need to copy this part of code)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // create the window
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window setBackgroundColor:[UIColor whiteColor]];
    [self.window makeKeyAndVisible];

    // set view controllers
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[[MainViewController alloc] init]];
    [self.window setRootViewController:navigationController];
}

Sur une action spécifique, affichez LoginViewController. Vous ne voulez pas que l'utilisateur puisse appuyer sur back et aller dans MainViewController. Plus tard, vous ne voudrez pas que l'utilisateur revienne à LoginViewController. Pour cette raison, vous devez le présenter comme modal:

// inside `MainViewController.m`
- (IBAction)myCoolActionToShowLogin:(id)sender {
    [self presentViewController:[[LoginViewController alloc] init] animated:YES completion:nil];
}

Maintenant, nous pouvons voir LoginViewController. Lorsque l'utilisateur termine la connexion, fermez-la et présentez HomeViewController:

// inside `LoginViewController.m`
- (IBAction)myAwesomeActionToShowHome:(id)sender {
    UINavigationController *navigationController = (UINavigationController *)[UIApplication.sharedApplication.keyWindow rootViewController];
    [navigationController pushViewController:[[HomeViewController alloc] init] animated:YES];
    [self dismissViewControllerAnimated:YES completion:nil];
}

REMARQUES:

Comme vous pouvez le remarquer, myAwesomeActionToShowHome: attend que votre contrôleur de navigation soit votre rootViewController. Cela fonctionne, mais devrait être plus agréable - vous devriez vérifier si cette navigation est en fait un contrôleur de navigation au lieu de la lancer. Ou vous pouvez créer un délégué ou un bloc pour en envoyer un nouveau. Il s'agit de la solution de travail la plus rapide et la plus simple, qui devrait être améliorée ultérieurement.

Vous devez vraiment lire: Apple Developer -> "View Controller Programming" documentation , car ce sont les principes fondamentaux que vous devez savoir pour développer et concevoir correctement l'UX.

Voici le fonctionnement exemple de démonstration .

11
Vive

Vous ne pouvez pas pousser à partir d'un contrôleur de vue présenté. Je vous suggère de conserver votre hiérarchie de navigation.

Pour cela, à partir de votre MainViewController, vous devez présenter LoginViewController et vous devez passer le contrôleur de navigation pour MainViewController.

- (IBAction)openLogin:(id)sender {
    LoginViewController *loginVC = (LoginViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"login"];
    [loginVC setReferencedNavigation:self.navigationController];
    [self presentViewController:loginVC animated:YES completion:nil];
}

Ensuite, dans LoginViewController, vous devez pousser vers HomeViewController comme ceci,

LoginViewController.h

@interface LoginViewController : UIViewController {
    UINavigationController *refNavigationController;
}
- (void) setReferencedNavigation:(UINavigationController *)refNavCon;

LoginViewController.m

- (void) setReferencedNavigation:(UINavigationController *)refNavCon {
    refNavigationController = refNavCon;
}

- (IBAction)openHome:(id)sender {
    [self dismissViewControllerAnimated:YES completion:^{
        UIViewController *homeVC = [self.storyboard instantiateViewControllerWithIdentifier:@"home"];
        [refNavigationController pushViewController:homeVC animated:YES];
    }];
}

En faisant cela, cela ressemblera à, vous poussez depuis LoginViewController mais en réalité vous poussez depuis MainViewController.

Vous pouvez personnaliser cette approche pour maintenir l'animation et l'interface utilisateur de ce flux.

enter image description here

9
Hemang

1) présenter un navigation controller with itsroot view controller` défini comme contrôleur de vue.

- (IBAction)LoginClicked:(id)sender 
{
    LoginViewController *loginViewController = [LoginViewController alloc] init];
    UINavigationController *navController = [UINavigationController alloc] initWithRootViewController:loginViewController];
    [self presentViewController:navController animated:YES completion:nil];
}

- (IBAction)buttonActionMethodOnLoginView:(id)sender
{
    HomeViewController *obj = [[HomeViewController alloc] init];
    [self.navigationController pushViewController:obj animated:YES];
}

J'espère que cela fonctionnera pour vous.

8
Rohit Pradhan

Le problème est que LoginViewController n'a pas de contrôleur de navigation. Ensuite, vous lui en donnez un.

MainViewController.m

Créez un UINavigationController, mettez LoginViewController dans la pile et présentez le UINavigationController.

- (IBAction)LoginClicked:(id)sender {
    LoginViewController *vc = [[LoginViewController alloc] init];
    UINavigationController = nav = [[UINavigationController alloc] init];
    nav.viewControllers = @[vc];
    [self presentViewController:nav animated:YES completion:nil];
}

LoginViewController.m

- (IBAction)buttonActionMethodOnLoginView:(id)sender{
    HomeViewController *obj = [[HomeViewController alloc] init];
    [self.navigationController pushViewController:obj animated:YES];
}

Rejeter

Appelez dismissViewControllerAnimated dans votre MainViewController.

6
ukim

Créer une instance UINavigationController

[[UINavigationController alloc] initWithRootViewController:[[LoginViewController alloc] init]]

Présentez ce navigationController puis appuyez sur ce que vous voulez VC.

4
Hunaid Hassan

MainViewController.m

 - (IBAction)LoginClicked:(id)sender {

     LoginViewController *vc = [[LoginViewController alloc] init];

     UINavigationController *loginNav = [[UINavigationController alloc] initWithRootViewController:vc]; 

     [self presentViewController:loginNav animated:YES completion:nil];  

 }

LoginViewController.m

- (IBAction)buttonActionMethodOnLoginView:(id)sender{
     NSLog(@"viewControllers %@",APPDELEGATE.nav.viewControllers);
     //LoginViewController is not in this array
     HomeViewController *obj = [[HomeViewController alloc] init];
     [self.navigationController pushViewController:obj animated:YES];
}
4
darshan

Il s'agit d'un code très simple pour le contrôleur de vue actuel et le contrôleur de vue Push.

- (IBAction)LoginClicked:(id)sender {
        LoginViewController *objLogicVC = [LoginViewController alloc] init];
        UINavigationController *navPresent = [UINavigationController alloc] initWithRootViewController:objLogicVC];
        [self presentViewController:navPresent animated:YES completion:nil];
}

- (IBAction)buttonActionMethodOnLoginView:(id)sender{
        HomeViewController *objHomeVC = [[HomeViewController alloc] init];
        [self.navigationController pushViewController:objHomeVC animated:YES];
}
4
Bera Bhavin

il suffit de mettre ce code dans Objectif C sur boutonaction

UIViewController *yourViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerName "];

[[self navigationController] pushViewController:yourViewControllerName  animated:YES];
3
iTALIYA

Pour Swift 3.0

Présentez votre contrôleur de vue comme un nouveau rootViewController

let navController = UINavigationController.init(rootViewController: self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController"))
self.present(navController, animated: true, completion: {})

Maintenant, poussez votre contrôleur de vue depuis le contrôleur de vue présenté

self.show(self.storyboard!.instantiateViewController(withIdentifier: "SignUpViewController"), sender: self)
3
emraz