iOS模态登录屏幕显示在应用程序的任何位置

时间:2014-02-26 13:58:55

标签: ios objective-c

创建iOS应用登录屏幕的最佳方法是什么?无论何时用户未登录,该屏幕都会以幻灯片方式显示?

在以下情况下,用户将“退出”:

  • 他从未登录过应用程序(即首次使用)
  • 他已明确退出应用
  • 他已在服务器上注销(例如,他的安全令牌已过期 在服务器上,并传达给应用程序)

我的应用程序包含一个UINavigationController,它被设置为应用程序的RootViewController,每个屏幕(登录屏幕除外)都会在用户导航应用程序时被推送到NavigationController。用户可以导航到的屏幕之一(即,被推入堆栈)是Logout屏幕(用户可以在其中注销应用程序)。登录屏幕应在需要时以模态方式显示,逻辑和演示应在一个集中位置进行。我正在使用故事板。

我试过的是继承UINavigationController(对于RootViewController),并在其viewDidAppear方法中检查用户是否已登录(我在NSUserDefaults中存储了一个标志) 。如果他已登录,则应用程序的第一个屏幕(以编程方式)被推入堆栈;如果他没有登录,登录屏幕(以编程方式)以模态方式显示。

这种方法有以下两个问题:

  • 您无法为子类设置背景图像 UINavigationController,因此短暂显示空白屏幕
  • 子类UINavigationController的{​​{1}}不是 弹出到RootViewController时调用(特别是当时 从退出屏幕弹出)

理想情况下,我想要一个中心位置来检查用户是否已登录(我希望子类viewDidAppear的{​​{1}}方法将成为此点)来检查用户的登录状态,并在需要时显示模态登录屏幕。

我查看了Login Screen using StoryboardExample for login screen modally based on storyboard(以及其中引用的其他内容),但没有一个解决了从中心点呈现模态登录屏幕的问题。

4 个答案:

答案 0 :(得分:0)

首先你应该注意,根据Apples开发人员的说法,你不应该是UINavigationController的子类。

其次,这是基于意见的,但我建议您应该使用您的应用程序委托类作为检查登录状态的支柱点,它是UINavigationController的单例,实际上是。

答案 1 :(得分:0)

我建议您发布NSNotification AppDelegate可以收听的AppDelegate,以便{{1}}负责展示您的模态登录视图。

只要用户退出或服务器回复说明令牌已过期,您的通信层就可以负责发布通知。

答案 2 :(得分:0)

尝试从“Login ViewController”以模态方式呈现UINavigationController:

在应用启动时,会显示LoginVC,需要凭据。如果登录成功,请按UINavigationController。

当登录失效时(注销,cookie过期,401来自服务器,......),关闭UINavigationController并返回LoginVC。

请注意,在返回LoginVC时,所有应用程序状态都将丢失,这可能是您想要的,也可能不是。

您的AppDelegate应保留对LoginVC的引用,您可以通过该引用调用'dismiss',例如

[((YourAppDelegate*)[[UIApplication sharedApplication] delegate]) fallbackToLoginVC]

答案 3 :(得分:0)

好的,这就是我最终做的事情:

John Woods指出,子类UINavigationController。相反,我创建了一个基础UIViewController,它在viewWillAppear中检查用户是否已登录;如果没有,则以模态方式显示“登录”屏幕。需要检查登录状态的所有View控制器都继承自此基本View Controller,因此它成为检查登录状态的“中心点”(我不喜欢将AppDelegate用于此类逻辑)。

我喜欢Mike Pollard建议在用户的令牌过期时使用通知来通知(因为这可能在调用viewWillAppear之前发生)。然后,也可以在基本视图控制器中完成订阅此通知。

Hendrik Demmer的解决方案可能是最简单的,但我不喜欢在视图控制器堆栈的底部“潜伏”一个登录屏幕 - 或者这只是在挑剔?