探索容器视图

我刚刚完成了一个应用程序,在该应用程序中,用户使用个人电子邮件和密码登录,如果用户已经登录但尚未注销,则希望该应用程序直接打开主供稿。 为了实现这一点,我使用了一个视图控制器,该控制器将负责控制哪个视图将是第一个,并将其称为“应用程序控制器”。

为了使App Controller具有此功能,我们需要执行一些步骤,因此让我们开始构建这个惊人的View Controller。 首先,我们需要将容器视图添加到App Controller的视图中。

容器视图在视图控制器的视图子图中定义一个区域,该区域可以包含子视图控制器。

这意味着,我们正在创建一个父子容器关系,其中父是我们的App Controller,而容器视图对象是一个占位符对象,代表一个子视图控制器的内容。 在添加任何子级之前,我们必须管理容器视图的大小和位置,因为它将反映在子级属性上。 在我的应用程序中,我将容器视图限制为应用程序控制器视图的边缘,因此任何子项都将在整个屏幕上显示。

其次,我使用了通知中心来控制从一个孩子到另一个孩子的切换,因此我在App Controller中添加了通知观察者,其中每个观察者的选择器是一个将实现切换的功能。 添加通知观察者的代码为:

该代码的第一部分具有两个功能。 第一个是不言自明的,使用通知的名称切换视图控制器,这里有两种情况,要么关闭登录VC,然后打开主VC,反之亦然。 为了执行此切换,我分别调用了另一个功能,以使用情节提要ID进行关闭和打开过程。 此功能是代码段“ switchToViewController(with id:StoryboardID)”中的私有功能。 根据Apple的文档格式,从旧VC到新VC的过渡周期包括两个步骤,将子View Controller添加到您的内容中,然后删除子View Controller。

在此过渡周期中,我们需要做的第一件事是通过调用值为nil的老孩子的willMoveToParentViewController:方法来准备用于更改的两个视图控制器。

willMoveToParentViewController:

在将视图控制器添加到容器视图控制器或从容器视图控制器中删除之前调用。

讨论区

当您的视图控制器需要知道已将其添加到容器时,可以重写此方法。

如果要实现自己的容器视图控制器,则必须在调用removeFromParentViewController方法之前,先传递子视图控制器的willMoveToParentViewController:方法,并传入父值nil

当您的自定义容器调用addChildViewController:方法时,它将在添加之前自动调用视图控制器的willMoveToParentViewController:方法作为子级添加。

现在,让我们开始添加子步骤。 为了使代码更简洁,我创建了两个单独的函数,loadViewController(withID:)使用情节提要ID实例化视图控制器,以及add(viewController:),它们将按照Apple文档中的说明实现添加过程,如下一个片段。

让我们在第二个函数中逐行进行,以了解如何将child添加到我们的容器视图中。 在第一行中,我们称为方法addChildViewController,该方法负责创建父子关系。 然后将新VC的视图添加到容器视图,并指定大小和位置。 最后,调用didMoveToParentViewController :,在这种情况下,父对象将是App Controller。

为了实现删除过程,我们需要通过调用view.removeFromSuperview()从容器的视图中删除子级的根视图,然后调用子级的removeFromParentViewController方法以最终确定父子关系的结尾。 最后的最后一步,调用新孩子的didMoveToParentViewController :,其中父VC是App Controller

完成所有这些步骤之后,我创建了一个函数,该函数将处理用于管理用户打开应用程序时应显示哪个VC的逻辑。 就我而言,由于我正在使用Firebase Auth,因此我将检查当前用户是否为nil,然后显示主VC,否则将显示登录VC。 除了App Controller的viewDidLoad()内的addNotificationObservers函数外,我还调用了此函数。

当用户单击登录按钮时,在我的登录VC内,将发布一个通知以关闭登录VC,而当用户单击注销按钮时,在主VC内将发布一个关闭主VC的通知。 在这两种情况下,App控制器都将监听这些通知。

这只是使用容器视图的一个简单示例,可用于段控制,导航控制器或选项卡控制器。

多亏了我出色的讲师Jim和Joel,以及Apple文档。