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

时间:2014-03-29 03:45:11

标签: ios uiviewcontroller facebook-login logout swrevealviewcontroller

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

以下是我的storyboard

的概述

Screenshot of storyboard

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

我尝试了[self.navigationController popToRootViewControllerAnimated:YES];,它没有做任何事情。

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

感谢。

7 个答案:

答案 0 :(得分:9)

试试这个,

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"NameOfYourStoryBoard" 
                                                     bundle:nil];
LoginViewController *add = 
           [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];

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

答案 1 :(得分:2)

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

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

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

将AppDelegate替换为在您的应用中调用它。

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

答案 2 :(得分:2)

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

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

将segue连接到目标视图控制器,如下所示 see in image

为segue指定标识符并为该segue指定方法

Like below image

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

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

答案 3 :(得分:2)

<强>问题

  

您想从视图控制器(源)返回到开头(a   目标视图控制器)当用户单击蓝色按钮时(在...上)   顶部)

<强>建议

我建议您快速查看highly rated SO answer,其中演示了如何使用展开segue(这是故事板中视图控制器上的绿色小框)。展开segue是实现目标的现代方式,但您也可以从源控制器调用dismissViewController:animated。你还应该使用unwind segue快速阅读一个非常小的Apple音符(TN2298)。

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

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

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

手动展开

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

Manual Unwind

答案 4 :(得分:1)

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

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

我找回了我的故事板&amp;从故事板开始我想要的视图控制器&amp;然后添加到导航控制器。最后,我使用SWRevealViewController方法将我想要的视图推到前面。

答案 5 :(得分:1)

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

x += 1

答案 6 :(得分:1)

当你有不同的故事板时,只需&#34;呈现&#34;初始故事板中所需的VC可以解决问题:

Swift 3

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

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

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

&lt; - 这适用于Xcode 8.2.1和iOS 10.2,但不保证是否可以永久使用。小心它。