【问题标题】:Return to initial view controller when user logs out用户注销时返回初始视图控制器
【发布时间】:2014-05-08 17:37:55
【问题描述】:

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

这是我的storyboard的概述:

当用户点击blue button(在顶部)时,我想回到开始。我会怎么做才能做到这一点?如您所见,我有多个Navigation Controllers,而我只使用Push-segues 到达那里。但是,我确实使用了SWRevealViewController,您可以在中间看到它。

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

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

谢谢。

【问题讨论】:

    标签: ios uiviewcontroller facebook-login logout swrevealviewcontroller


    【解决方案1】:

    试试这个,

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

    【讨论】:

    • 成功了,但是当我回到登录屏幕并按下登录按钮(这只是标准的 Facebook,那里没有更改)时,我在控制台中得到了 10 个:@ 987654322@。你能猜出来吗?
    • @Alekplay - 我在使用第三方库时或有时在旧版(测试版)Xcode 上看到过这类问题。如果您有任何第三方库,您可能需要联系以获取最新版本或升级 Xcode。顺便说一句 - 最新版本的 Xcode 也有一些这些怪癖,但它们不会转化为应用程序(通常)。当然,里程可能会因您的情况不同而有所不同。
    • 我不确定这是一个好的解决方案。您正在做的是在现有堆栈之上创建另一个 UI 堆栈。如果用户多次执行此操作,堆栈会变得越来越大,您将耗尽内存。此外,许多堆叠的 VC 相互叠加还会产生其他副作用。
    【解决方案2】:

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

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

    为目标视图控制器提供 segue 连接,如下所示

    为 segue 提供标识符并将方法分配给该 segue

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 我假设你错过了],所以我在 Xcode 建议的地方添加了它。这就是我所拥有的UINavigationController *rootController =[[(UINavigationController*)[[(XYZAppDelegate*) [[UIApplication sharedApplication]]delegate] window] rootViewController];。但我收到一条错误消息,提示 Expected Identifier。你有解决办法吗?
      【解决方案4】:

      问题

      你想从一个视图控制器(源代码)返回到开始(一个 目标视图控制器)当用户点击蓝色按钮(在 顶)

      推荐

      我建议您快速查看highly rated SO answer,它演示了如何使用展开转场(即情节提要中视图控制器上的绿色小退出框)。 Unwind segues 是实现目标的现代方式,但您也可以从源控制器调用dismissViewController:animated。您还应该快速阅读一个关于使用 unwind segue 的非常小的 Apple 说明 (TN2298)。

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

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

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

      手动展开

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

      【讨论】:

        【解决方案5】:

        我正在研究一个非常相似的问题。我正在使用带有导航控制器的故事板并使用 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 方法将我想要的视图推到前面。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 您的代码有效,但我不得不为 swift 2 稍作修改,现在看起来像这样,让 loginVC: UIViewController? = self.storyboard?.instantiateViewControllerWithIdentifier("loginWindow") self.presentViewController(loginVC!, animated: true, completion: nil)
          • 我不确定这是一个好的解决方案。您正在做的是在现有堆栈之上创建另一个 UI 堆栈。如果用户多次执行此操作,堆栈会变得越来越大,您将耗尽内存。此外,许多堆叠的 VC 相互叠加还会产生其他副作用。
          【解决方案7】:

          当您有不同的故事板时,只需从初始故事板“呈现”所需的 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()
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-28
            • 1970-01-01
            • 2018-01-13
            • 2012-10-12
            • 2012-10-13
            • 2012-06-02
            相关资源
            最近更新 更多