在视图控制器之间来回切换

Posted

技术标签:

【中文标题】在视图控制器之间来回切换【英文标题】:segue back and forth between viewcontrollers 【发布时间】:2015-02-25 13:20:54 【问题描述】:

我正在我的应用中实现单点登录(用户只需登录一次)。

但用户可以根据需要退出。

我将用用例流程解释我的问题。

流程:

    loginViewController -> 用户按下登录 -> 我转到 appNavigationController(HomePageViewController 是根 viewController) HomePageViewController -> 用户退出应用程序 -> 我转回登录页面 用户重新登录。

现在我有一个问题。

我收到一个错误:

Warning: Attempt to present <app.loginViewController: 0x15d559f00> on <app.homeViewController: 0x15d625660> whose view is not in the window hierarchy!

我不知道这是否是问题,但 navigationController 正在保存第一个 homeViewController 并且它没有清空堆栈 我试图在viewDidDisappear 中弹出homeViewController 它没有工作堆栈仍然保存第一个homeViewController

有什么建议吗?

【问题讨论】:

【参考方案1】:

您的 ViewController 需要如下所示:

UINavigationController --(rootViewController)--> loginViewController --(Segue)--> HomePageViewController

或者您可以执行以下操作:

UITabViewController:

viewController1 : 登录视图控制器

viewController2 : UINavigationController --(rootViewController)--> 主页视图控制器

不,一旦用户登录,您可以导航到 viewController2 Tab 并显示 HomePageViewController

一旦用户注销,您可以在viewController2 TabpopToRootViewController 并切换到viewController1 Tab 以显示loginViewController

【讨论】:

我可以有一个不带标签按钮的 tabViewController 吗? 是的...你可以隐藏它们 很高兴为您提供帮助...查看 UITabBarController 文档developer.apple.com/library/ios/documentation/UIKit/Reference/… 我可以隐藏情节提要中的标签吗?它将标签添加到我所有的视图控制器并弄乱了用户界面 是的,在 StoryBoard 中选择您的 viewController 并打开“属性检查器”。您可以通过将下拉菜单更改为“无”来显示和隐藏底栏【参考方案2】:

您的应用中是否只有一个 1 navigationController。我不这么认为。 如果您想要一个简单的来回切换,应该只有一个 NavigationController。

否则,如果您确实有 2 个或更多 NavigationController,那么您需要以编程方式将新 NavigationController 添加到 window。

【讨论】:

我只有 1 个 navigationController。 登录页面是一个视图控制器,应用程序的其余部分在一个导航控制器中。在 appDelegate 中,我检查用户是否已登录,如果他是我将窗口设置为具有 navigationController 如果 loginviewcontroller 后面没有导航控制器,那么你不能“继续”回到它。您的程序必须以导航控制器开始。

以上是关于在视图控制器之间来回切换的主要内容,如果未能解决你的问题,请参考以下文章

iOS UI 元素在标签栏控制器中来回切换后被拉伸

切换视图时标签栏丢失

在 2 个子视图控制器之间来回传递数据

来回切换时锁定的 ViewController 方向中断

从一个 VC 切换到另一个 VC 时在视图控制器中保留数据

Swift viewcontroller firebase 数据库观察者重复调用