【问题标题】:Do I have to unwind the 'stack' in storyboard during logout?注销期间是否必须展开情节提要中的“堆栈”?
【发布时间】:2011-11-01 20:48:15
【问题描述】:

我有一个这样的故事板设置:

标题画面
(推)
登录界面
(CustomSegue)
UITabBarViewController(这里的根视图是一个 UINavigationController)
(模态)
设置视图
(CustomSegue)
标题画面

所以我的目标是在SettingsView 中有一个“Logout”按钮,它会将用户带回TitleScreen

但是,当我尝试此操作时,注销后,TitleScreen 将不再转换为 LoginScreen。它在启动应用程序时有效,但在我“注销”后无效。

这是否意味着,我必须以某种方式展开情节提要“堆栈”?如果是这样,如何通过 1 个转换来完成?

想法:通过NSNotificationCenterAppDelegate 发送通知,以重新创建rootViewControler

以前有人做过吗?

【问题讨论】:

  • 向应用委托发送通知确实有效。应用委托必须首先关闭 rootViewController。完成后,使用 Storyboard 的初始视图控制器重新初始化它。谢谢。

标签: objective-c cocoa-touch ios5


【解决方案1】:

我会在这里重新考虑一下您的故事板布局。标题屏幕和登录屏幕本质上只是应用程序主要部分顶部的模态视图,UITabBarController。我会让UITabBarController 成为情节提要中的初始视图控制器,然后在应用程序完成启动后有条件地显示标题视图/登录屏幕。

现在有了这种设计,显示登录屏幕就像执行任何模态转场一样简单。您可能需要考虑使用设置视图控制器的委托来通知呈现视图控制器用户已注销并且应该呈现登录视图控制器。

【讨论】:

  • 我确实尝试过,但我意识到 UITabBarController 中视图的实现不会那么干净,因为它现在必须知道“登录前”状态。
  • 至于从设置到模态父级的委托,我更喜欢使用NSNotificationCenter。它本质上是 EventBus 模式,而且更简洁,更符合我的口味。
【解决方案2】:

如果是我,我会把导航控制器放在设计的开头,然后使用 popToRootViewController:animated: 回到根目录。如果您不希望在登录页面等较早的视图中显示导航栏,您可以随时选择隐藏它。

我在tutorial here 中做了类似的事情,我在设计顶部的两个选项卡上都有一个导航控制器,除了我没有隐藏任何东西,因为它只是为了教程。

【讨论】:

  • 我确实考虑过这一点,但很快意识到UINavigationController 不应该包含UITabBarController。因为UITabBarController 的其中一个孩子可能是UINavigationController
  • 不,我还会在此层次结构的顶部同时拥有标签栏和导航控制器。我在我的教程中做了类似的事情。我已经相应地编辑了我的答案
猜你喜欢
  • 2014-04-17
  • 2012-05-03
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2017-01-18
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多