从iOS中的“呈现视图控制器”推送视图

简而言之:我如何从提出的ViewController PushViewController?

简单来说 :

我有MainViewController ,其中我有一个button点击button,我提出了一个名为LoginViewController的视图。

在这个页面( LoginViewController ),我再次有button ,点击,我尝试推我的视图控制器(称为HomeViewController )它不推动。

这是我的代码片段,

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

但它不适合我。 另外,在pushed之前我打印a stack of view controllers ,但是它没有LoginViewController 。 所以,如果不将LoginViewController添加到a stack of view controllers ,我怎样才能从LoginViewController pushed送到HomeViewController

当我从HomeViewController getBack,然后LoginViewController应该打开..

是否有可能使用这个单一的NavigationController

注意:在这里,我刚刚举了一个使用Login,Home和Main ViewController的例子。 但是我希望进入其他屏幕。

嗨,当你正在呈现你login视图控制器只是呈现一个导航控制器,如:

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

现在您的PresentsViewController是一个导航控制器,现在您可以简单地推送到您的主页VC

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

希望这会对你有所帮助

LoginViewController不应该被推送到导航控制器堆栈。 让我在下面描述“为什么”。

我们的MainViewController应该在堆栈上 – 你总是想回到那里。

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

在具体操作上显示LoginViewController 。 您不希望用户能够back并转到MainViewController 。 稍后,您将不希望用户返回到LoginViewController 。 因此,您需要将其作为模式呈现:

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

现在我们可以看到LoginViewController 。 当用户完成login时,closures它并呈现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]; } 

笔记:

正如你可能会注意到, myAwesomeActionToShowHome:期望你有导航控制器作为你的rootViewController 。 这是工作,但应该更好 – 你应该检查,如果导航实际上是导航控制器,而不是铸造它。 或者你可以创build一个委托或块来推新的。 这是最快,最简单的工作解决scheme,稍后应该改进。

您应该阅读: Apple Developer – >“View Controller Programming”文档 ,因为这些是您正确开发和deviseUX所应该了解的核心基础知识。

这里是工作演示样本 。

你不能从一个呈现的视图控制器推。 我build议,你应该保持你的导航层次结构。

为此,从你的MainViewController,你应该呈现LoginViewController,你应该通过导航控制器的MainViewController。

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

然后在LoginViewController里面,你应该像这样推送到HomeViewController,

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

通过这样做,它会看起来像,你从LoginViewController推,但实际上你从MainViewController推。

您可以自定义此方法来维护此stream程的animation和UI。

在这里输入图像说明

1)将navigation controller with its根视图控制器设置为视图控制器的navigation controller with its控制器。

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

希望它能为你工作。

问题是LoginViewController没有导航控制器。 然后你给它一个。

MainViewController.m

创build一个UINavigationController ,将LoginViewController放入堆栈并显示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]; } 

解雇

MainViewController调用dismissViewControllerAnimated

创build一个UINavigationController实例

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

呈现navigationController,然后推动你想要的任何VC。

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

这是目前的视图控制器和推视图控制器非常简单的代码。

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

您必须从您的firstView( MainViewControllerPush ,但您可以使用与PresentViewDismissView相同的animation。 为此使用以下代码: –

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

对于Pop (在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]; 

使用这个代码,你可以得到与Present-Dismiss ViewControllers相同的animation。 参考这个答案了解更多详情。

之后,您可以使用您的代码将LoginViewController Pushing送到HomeViewController

希望,这是你要找的。 任何关心回到我身边。 🙂

简单地把这个代码放在button 操作的 目标c

 UIViewController *yourViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerName "]; [[self navigationController] pushViewController:yourViewControllerName animated:YES]; 

对于Swift 3.0

将您的视图控制器作为一个新的rootViewController呈现

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

现在从推荐的视图控制器推你的视图控制器

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