10

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

这是我的概述storyboard

故事板截图

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

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

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

谢谢。

4

7 回答 7

9

尝试这个,

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

[self presentViewController:add 
                   animated:YES 
                 completion:nil];
于 2014-03-29T04:31:06.977 回答
2

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

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

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

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

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

于 2014-03-29T03:51:56.857 回答
2

问题

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

推荐

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

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

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

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

手动展开

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

手动展开

于 2014-03-29T17:25:51.550 回答
2

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

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

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

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

如下图

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

 [self performSegueWithIdentifier:@"pushtoDashboard" sender:self];
于 2014-03-29T04:22:15.757 回答
1

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

于 2014-05-30T17:33:25.943 回答
1

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

var loginVC: UIViewController? = self.storyboard?.instantiateViewControllerWithIdentifier("UILogin") as?    UIViewController

self.presentViewController(loginVC!, animated: true, completion: nil)
于 2015-05-06T20:27:28.530 回答
1

当您有不同的故事板时,只需从初始故事板中“呈现”所需的 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,但不能保证是否永远有效。小心它。

于 2017-04-14T16:36:53.160 回答