迅速小吃105:Ch-ch-ch-ch-changes


小吃boi和小吃gal的搭扣,这里是105。 Shizzle变得真实。

所有流行的社交应用程序都要求用户完成注册过程。 需要注册,以便为每个用户分配唯一的标识符。 该标识符用于识别存储在云中的与用户相关联的数据(例如消息)。

让我们假设。 我街上最酷的孩子,刚把我带到Snackergram,这是拍摄小吃的最热门新方式。 打开时,Snackergram会显示一个“启动屏幕”,该屏幕充当封面,应用程序在其后开始运转。 几秒钟后,我看到一个注册/登录屏幕,因为该应用知道我是新用户。 注册完成。 显示主用户界面。 Snackergram上的小吃很摩尔人,以至于我不得不注销以避免诱惑。 注销后,重新出现注册/登录屏幕。

以前,我通过在应用程序的主导航堆栈上模态显示注册/登录视图控制器来实现上述工作流程。 这种方法并不理想,因为它将主导航堆栈的视图控制器保留在内存中,并且就用户体验而言,这种方法不够灵活。

这些天,我遵循Stan Ostrovskiy在以下链接中描述的体系结构:–

https://medium.com/@stasost/ios-root-controller-navigation-3625eedbbff

Stan的方法是为每个应用程序的关键过程分别构建UINavigation堆栈:注册/登录工作流程和主要应用程序功能。 建立“四分卫”(根视图控制器)以根据给定时间的用户状态显示适当的孤立堆栈。

是时候建立一个说明性的例子了。 启动一个单一视图项目,然后删除该故事板业务(请参见Swifty Snacks 101)。 将“样板” ViewController.swift文件重命名为RootController.swift,然后在AppDelegate的didFinishLaunchingWithOptions中将应用程序窗口的rootViewController设置为RootController。

在RootController中,将视图的backgroundColor设置为红色。 生成并运行以检查一切是否正常。

RootController将充当我们的四分卫,让我们给它一些团队一起玩。 当应用“启动”时,Team SplashController会向用户显示启动屏幕。 在其视图中添加活动指示器,并指示其循环3秒钟,以模仿对云的调用。

接下来,构造团队RegistrationLoginController。 除了关联的功能“登录”之外,还添加一个左侧的栏按钮作为navigationItem。

最后,建立应用程序的MainController团队,添加与功能“注销”关联的“注销”按钮。

为了使我们的“四分卫”领导,我们必须授权其队友在需要时参考他的领导。 我们将把这种参考方式定义为AppDelegate的扩展。

现在,我们可以从应用程序中的任何位置调出“四分卫”(又名rootViewController)。 太好了,现在返回RootController为其提供工具来管理其新发现的职责。

目的是将我们的“四分卫”设置为父视图,并按照指示添加适当的孩子。 使用私有变量设置对当前子视图控制器的引用。

通过向类添加初始化程序来解决xCodes问题。

接下来,允许xCode添加所需的init(coder),按入警告并选择“修复”。 现在,在viewDidLoad()中,我们可以将当前视图控制器设置为RootController的子级,该控制器将作为SplashController类的实例开始。 将孩子的view.frame设置为与父对象的view.bounds相等。 我们这样做是为了在UI发生更改(例如,调用通话状态栏)时,孩子的框架与其父视图保持一致。 将子级添加为子视图,然后通过调用didMove(toParent:self)完成此过程,必须在“将视图控制器添加到容器视图控制器中或从容器视图控制器中删除视图控制器之后调用”。

现在,我们可以在RootController中构建三个新函数,供四分卫使用,以更改显示的当前ViewController:showRegistrationLoginScreen()和showMainScreen()。

考虑showRegistrationLoginScreen()。 在第1部分中,我们添加了RegistrationLoginController()实例作为四分卫的孩子。 请注意,RegistrationLoginController()被嵌入为新UINavigationController的根-请勿将此根与我们应用的rootViewController(又名四分卫)混淆。 第2部分将安装四分卫的孩子作为其当前视图控制器,即它将显示给用户的四分卫的孩子-旧的,新的。

根据showRegistrationLoginScreen()的结构,继续构建showMainScreen()。

到目前为止,一切都很好。 最后,让我们“遍历”用户旅程,添加代码以通知四分卫根据当前会话状态应显示哪些视图控制器。

我们刚安装的应用程序将告诉其四分卫(RootController)显示SplashController()的实例。 SplashController()将伪造对外部服务的调用。 在这里,利用NSUserDefaults的if / else语句将根据会话状态来确定要采取的措施。 如果用户为“ LOGGED_IN”,则将指示该应用的四分卫显示MainScreen(又名MainController)。 否则,四分卫将负责显示RegistrationLoginController。 初始会话状态为’LOGGED_IN’= false,因此显示RegistrationLoginController。

在指示应用的四分卫显示MainController()的实例之前,RegistrationLoginController将假定注册已成功,并将会话状态设置为’LOGGED_IN’= true。

最后,应用程序的MainController将会话状态设置回’LOGGED_IN’= false,如果用户选择注销,则通过我们的四分卫显示RegistrationLoginController。

谢谢,晚安!

“有时候,如果幸运的话,首先想到一个好主意。 通常,它只会在出现很多坏主意之后出现。” — Alex Blumberg