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

Posted

技术标签:

【中文标题】iOS 模态登录屏幕显示在应用程序的任何位置【英文标题】:iOS Modal Login Screen presented anywhere in app 【发布时间】:2014-02-26 13:58:55 【问题描述】:

在用户未登录时创建一个滑入(通过模态显示)的 ios 应用登录屏幕的最佳方法是什么?

在以下情况下,用户将被“注销”:

他从未登录过应用程序(即第一次使用) 他已明确退出应用程序 他已在服务器上注销(例如,他的安全令牌已过期 在服务器上,并与应用程序进行通信)

我的应用包含一个设置为应用的 RootViewController 的 UINavigationController,并且每个屏幕(登录屏幕除外)在用户导航应用时被推送到 NavigationController。用户可以导航到的屏幕之一(即被推送到堆栈上)是注销屏幕(用户可以在其中注销应用程序)。登录屏幕应在需要时以模态方式显示,逻辑和演示应集中在一个地方。我正在使用情节提要。

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

这种方法存在以下两个问题:

您不能为子类设置背景图像 UINavigationController,所以会出现一会黑屏 子类UINavigationControllerviewDidAppear 不是 在弹出到它的 RootViewController 时调用(特别是当 从注销屏幕弹出)

理想情况下,我希望有一个中心位置来检查用户是否登录(我希望子类 UINavigationControllerviewDidAppear 方法会是这个位置)来检查用户的登录状态,并显示模式如果需要,登录屏幕。

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

【问题讨论】:

【参考方案1】:

首先您应该注意,根据 Apple 的开发人员说明,您不应该继承 UINavigationController。

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

【讨论】:

我将如何何时检查 AppDelegate 中的登录状态? IE。是否有足够“定期”调用的方法(例如 ViewController 中的 viewDidAppear)我可以在其中进行检查?【参考方案2】:

我建议发布您的AppDelegate 可以收听的NSNotification,以便AppDelegate 负责呈现您的模式登录视图。

您的通信层可以负责在用户注销或服务器响应说令牌已过期时发布通知。

【讨论】:

【参考方案3】:

尝试从“登录视图控制器”模态显示 UINavigationController:

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

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

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

您的 AppDelegate 应保留对 LoginVC 的引用,通过它您可以调用“dismiss”,例如

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

【讨论】:

这意味着 LoginViewController 将始终在 View Controller 堆栈上;这不是一件坏事(尤其是从内存使用的角度来看)?【参考方案4】:

好的,这就是我最终要做的:

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

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

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

【讨论】:

以上是关于iOS 模态登录屏幕显示在应用程序的任何位置的主要内容,如果未能解决你的问题,请参考以下文章

如何防止模态盒关闭?

如何等到模态对话框在ios中返回结果

如何防止模态框关闭?

在 iOS 7 的模态视图或表单中显示 UIImagePickerController?

Branch.io 呈现导航控制器

模态segue推动顶部的附加导航栏滑动