如何展开到导航堆栈上的第一个视图控制器

Posted

技术标签:

【中文标题】如何展开到导航堆栈上的第一个视图控制器【英文标题】:How to unwind to the first view controller on a navigation stack 【发布时间】:2016-12-10 10:51:28 【问题描述】:

我在将视图展开到登录屏幕时遇到问题。故事板结构如下: Storyboard Structure

应用程序的用户流程如下: LoginVC上的用户登录->通过模态segue进入主标签栏屏幕->在每个标签栏项目上,我在导航控制器上添加了右栏按钮以访问配置文件页面,每个标签栏项目都有独立的导航控制器以保留导航控制器结构线性。 -> 一旦我点击个人资料页面按钮,个人资料页面以模态方式呈现 -> 当点击个人资料页面上的注销按钮时,它会触发展开 segue 并关闭视图控制器

func logoutUser()

        //Networking.logoutUser()
        print("It goes to login")
        self.performSegue(withIdentifier: "unwindToLogin", sender: self)

unwind segue 是在最左边的 VC 上的 LoginVC 上实现的。我在配置文件屏幕上连接了 unwind segue 并称之为“unwindToLogin” 我只是使用了 performSegueWithIdentifier。但是,该方法不会被调用,视图也不会发生任何事情。

编辑 1: 我想知道,因为我在标签栏 vc 上以模态方式调用配置文件页面,它找不到 unwindtologin。 如果我只是简单地使用实例化视图控制器来调用登录,它会清除我的视图控制器堆栈吗?

编辑 2: 抱歉,我忘记了当我检查用户是否登录时,我使用以下代码:

    if (FIRAuth.auth()?.currentUser != nil) 
        self.storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        self.window?.rootViewController = self.storyboard?.instantiateViewController(withIdentifier: "TabBarViewController")
    

所以实际上他们找不到 unwind 方法,因为根视图不是主登录视图控制器。

谁能帮忙?

【问题讨论】:

How can I go back to the initial view controller in Swift?的可能重复 【参考方案1】:

使用 unwind segue 移动到任何视图控制器。

当您单击按钮时移动到任何视图控制器。

- (IBAction)unwindToCurrentController:(UIStoryboardSegue *)unwindSegue

将以上这些行添加到您的 loginViewController.m 文件(或)添加 这些行是您要移动到的视图控制器。 实际上你想在点击一个 按钮。因此,请为此事件创建一个按钮或选择任何按钮。 在执行此操作之前,您需要将上述代码添加到您的登录视图中 控制器。现在通过拖入 Exit 为您的按钮添加操作 顶部视图控制器上的选项。 它显示了一个展开选项 unwindToCurrentController。单击该选项 并连接它。

现在构建并运行您的应用。它完美地工作。

【讨论】:

【参考方案2】:

您需要在要调用它的每个 ViewController 上创建展开转场。他们都可以在登录屏幕中使用相同的@IBAction 目的地,并且都可以称为"unwindToLogin"

我看到MainTabBarController 上定义的展开转场。在您的UserProfileController 中,您需要control-从view Controller 图标拖动到Exit 图标,然后在其中选择您的@IBAction弹出。然后在 Document OutlineUserProfileController 中找到 unwind segue,并将其标识符设为 "unwindToLogin"


响应您的编辑 2:

由于您的初始 viewController 是以编程方式放置的,因此无法展开到 LoginViewController。在这种情况下, 将登陆@IBAction 放入您的MainTabBarController 并将self.window?.rootViewController 设置为登录屏幕。

【讨论】:

是的,在这种情况下,我在个人资料页面上调用了 unwindtologin。它不会被调用。我想知道 xcode 是否找不到 unwindtologim,因为我从标签栏项目模态地呈现了个人资料页面 你能解释一下吗? @vacawama 您的 @IBAction 是否在登录屏幕 VC 中定义,您是否从配置文件屏幕本身创建了一个展开转场? 是的,@IBAction 在 loginVC 中并在个人资料页面上展开 好的结构照片在上面:loginvc -> modal to main tab bar -> tab bar item 1 with nav controller -> right bar button item to profile , present modal -> unwind from profile yo login vc 【参考方案3】:

你可以试试这个它对我有用。

[self.presentingViewController dismissViewControllerAnimated:NO completion:nil];

我用它来关闭一个模态视图,以便我可以返回原始视图。

【讨论】:

以上是关于如何展开到导航堆栈上的第一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

转到应用程序中的第一个视图控制器

如何在情节提要的标签栏上启动导航控制器的第三个视图控制器

如何在我的 Xcode Swift 项目的不同导航堆栈中从一个视图控制器屏幕切换到另一个?

显示一个已经在导航堆栈上的视图控制器

从导航堆栈中删除视图控制器

管理堆栈上的导航视图