SWRevealViewController – 手动切换到另一个视图?

我有一个用SWRevealViewController制作的边栏菜单。

边栏中的一个菜单元素是“login”。 它打开login视图(通过自定义SWRevealViewController)。

我想以编程方式切换到用户成功login后的另一个视图。我该怎么做?

更新 ,我的代码:

ViewController *vc = [[ViewController alloc] init]; // this is main front ViewController SWRevealViewController *revealController = self.revealViewController; [revealController setFrontViewController:vc animated:YES]; 

在此之后,我只是空的屏幕。 我究竟做错了什么? 我觉得这是错误的:

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

那么访问已经加载的视图控制器的正确方法是什么? (它通过SWRevealViewController作为前端控制器在应用程序启动时加载)

使用- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated; 方法

SWRevealController有它自己的属性,你可以从任何UIViewController访问:

 SWRevealViewController *revealController = self.revealViewController; 

你可以在它的GitHub仓库中检查示例项目: https : //github.com/John-Lluch/SWRevealViewController

尝试这个:

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; SecondViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; [navController setViewControllers: @[rootViewController] animated: YES]; [self.revealViewController setFrontViewController:navController]; [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES]; 

为我工作:-)

尝试这个:

 ViewController *vc = [[ViewController alloc] init]; // this is main front ViewController UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController; [navController setViewControllers: @[vc] animated: YES]; // [navController pushViewController:vc animated:YES]; // use this if you want to stack the views [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES]; 

这是一个setFrontViewController解决scheme的Swift版本:

 if let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("SecondViewControllerStoryBoardID") as? SecondViewController { let navController = UINavigationController(rootViewController: secondViewController) navController.setViewControllers([secondViewController], animated:true) self.revealViewController().setFrontViewController(navController, animated: true) } 

有一个新的API - (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;

据我所知,这是手动切换视图控制器正确animation的最优雅的方式。

 // get the view controller you want to push to properly. // in this case, I get it from Main.storyboard UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController * vc = [sb instantiateViewControllerWithIdentifier:@"SignInViewController"]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc]; [navController setViewControllers: @[vc] animated:NO]; [self.revealViewController pushFrontViewController:navController animated:YES]; 

如果你在目标vc不导入SWRevealViewController并想推回:

 // get your vc properly [self.navigationController setViewControllers:@[vc] animated:YES]; 

请注意[self.navigationController showViewController:vc sender:self]; 有相同的结果,但不要使用这个,因为这会在导航堆栈上创build一个新的视图控制器,这在使用SWRevealViewController基本没有意义。

这个完美的为我工作

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; ViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"NavController"]; [navController setViewControllers: @[rootViewController] animated: YES]; [self.revealViewController setFrontViewController:navController]; [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES]; 

@Evana有一个很好的答案,但是,我的情况下,将parameter passing给destViewController,我需要改善它如下。 完全按照她的例子,我注意到DestViewController的viewDidLoad被调用两次。 首先在'selectedId'上有0,只有第二次调用'selectedId'正在接收我的标签值。

因此,为了更清晰的导航,必须从navController获得DestViewController,这样就不会有多余的呼叫。

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"DestNavController"]; DestViewController *destViewController = (DestViewController*)[[navController viewControllers] objectAtIndex:0]; destViewController.selectedId = ((UIButton*)sender).tag; [self.revealViewController setFrontViewController:navController];