用户注销时返回初始视图控制器

我正在开发一个使用Facebook集成的应用程序, log in系统现在运行正常。 但是,当用户单击log out时,我似乎无法返回到我的初始视图控制器。

这是我的storyboard的概述:

故事板的屏幕截图

当用户点击blue button (在顶部)时,我想返回到开头。 我该怎么做才能实现这一目标? 正如您所看到的,我有多个Navigation Controllers ,我只使用Push-segues来实现目标。 但是,我确实使用了SWRevealViewController ,您可以在中间看到它。

我试过[self.navigationController popToRootViewControllerAnimated:YES]; 什么也没做。

任何建议? 有谁熟悉SWRevealViewController以及它可能对我的Navigation堆栈做了什么? 任何帮助将不胜感激!

谢谢。

尝试这个,

 UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"NameOfYourStoryBoard" bundle:nil]; LoginViewController *add = [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"]; [self presentViewController:add animated:YES completion:nil]; 

在根视图控制器中写下方法

 - (IBAction)returnToDashboard:(UIStoryboardSegue *)segue; 

给segue连接到目标视图控制器,如下所示 看到图片

给segue赋予标识符并为该segue分配方法

如下图所示

在目标视图控制器中使用以下方法

  [self performSegueWithIdentifier:@"pushtoDashboard" sender:self]; 

首先,我认为你不需要那么多的UINavigationControllers。 在应用程序中只使用一个就足够了。 popToRootViewController在你的情况下不工作的原因是因为它将使用UINavigationController转到第一个视图控制器。 您已经嵌套了许多UINavigationControllers,因此当您单击设置视图控制器中的蓝色按钮时,它将转到侧边栏视图控制器(无法正确读取,图像很小)。

您可以执行以下操作以访问应用程序的根视图控制器:

 UINavigationController *rootController =[(UINavigationController*)[(AppDelegate*) [[UIApplication sharedApplication]delegate] window] rootViewController]]; 

无论如何在您的应用中调用AppDelegate。

但我的建议是删除所有中间UINavigationControllers。 然后只需要执行popToRootViewController即可。

问题

当用户单击蓝色按钮(在顶部)时,您希望从视图控制器(源)返回到开始(目标视图控制器)

建议

我建议你快速浏览一下评价很高的SO答案 ,演示如何使用unwind segue(这是故事板中视图控制器上的小绿色退出框)。 展开segues是实现目标的现代方式,但您也可以从源控制器调用dismissViewController:animated。 你还应该使用unwind segue快速阅读一个非常小的Apple音符( TN2298 )。

基本上,您需要将以下方法添加到目标视图控制器:

 - (IBAction)unwindToMainMenu:(UIStoryboardSegue*)sender { } 

然后使用ctrl +拖动并从蓝色按钮向下单击到视图控制器上的绿色退出图标。 这将弹出一个菜单,您可以从列表中选择unwindToMainMenu 。 您需要在Identity Inspector中为新segue指定一个标识符(例如segueToMain)。

手动展开

上面的技术说明(TN2298)还将向您展示如何创建可以通过编程方式调用的手动展开segue(类似于人们可能会说的performSegueWithIdentifier …)。

手动展开

我正在研究一个非常类似的问题。 我正在使用带导航控制器的故事板,并使用iOS 7和Xcode 5.1实现了强烈推荐的SWRevealViewController 。 我试图实现一些提到的解决方案失败了。 屏幕没有改变或我有空白表。 我使用SWRevealController中提供的混合版本的程序示例和其他答案来获得一个有效的解决方案。 我将此添加为登录按钮操作的一部分

 UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; InboxTableViewController *viewController = [storyBoard instantiateViewControllerWithIdentifier:@"inbox"]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController]; [self.revealViewController pushFrontViewController:nav animated:YES]; 

我检索了故事板并从故事板中启动了我想要的视图控制器,然后添加到导航控制器中。 最后,我使用SWRevealViewController方法将我想要的视图推到前面。

我正在使用swift,对我有用的是:

 var loginVC: UIViewController? = self.storyboard?.instantiateViewControllerWithIdentifier("UILogin") as? UIViewController self.presentViewController(loginVC!, animated: true, completion: nil) 

如果你有不同的故事板,只需从最初的故事板“呈现”所需的VC就可以了:

斯威夫特3

 if let loginVC = UIStoryboard(name: "Login", bundle: nil).instantiateInitialViewController() { present(loginVC, animated: true, completion: nil) } 

在某些情况下,UITransitionView可能会泄漏。 您可以在“呈现”代码之后立即删除它们,但不能在它之前删除它们而不是它完成:

 if let subviews = UIApplication.shared.keyWindow?.subviews, let transitionViewClass = NSClassFromString("UITransitionView") { for subview in subviews where subview.isKind(of: transitionViewClass) { subview.removeFromSuperview() } } 

< - 这适用于Xcode 8.2.1和iOS 10.2,但不保证是否可以永久使用。 小心一点。