如何展开到导航堆栈上的第一个视图控制器
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 Outline 的 UserProfileController
中找到 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];
我用它来关闭一个模态视图,以便我可以返回原始视图。
【讨论】:
以上是关于如何展开到导航堆栈上的第一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章