从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( MainViewController
) Push
,但您可以使用与PresentView
和DismissView
相同的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)