分解AppDelegate(Swift 3)

在Xcode中,当您创建一个新的单视图项目时,您马上就可以在项目文件夹中找到一些文件。

这些是构建项目的良好起点-您可以将它们视为开箱即用运行项目所需的基本代码模板。 当然,如果您运行,则只会看到白屏。

让我们仔细看看AppDelegate.swift并查看该文件中发生了什么,以便我们了解它的作用以及为什么需要它。

我们看到的第一件事是我们正在导入UIKit框架。 Apple文档可以为我们提供有关框架功能的更多信息:

构建和管理适用于iOS和tvOS的应用程序的用户界面。 响应用户交互和系统事件,访问各种设备功能,启用辅助功能,并使用动画,文本和图像。 在watchOS应用中,启用辅助功能并使用字体和图像。

通过看到这已导入-我们知道AppDelegate类需要与用户界面建立某种连接。

@UIApplicationMain

接下来是“ @UIApplicationMain ”。 这是怎么回事? 尽管在上一行中,但它实际上是AppDelegate类声明的一部分。 它称为属性。

将此属性应用于类以指示它是应用程序委托。 使用此属性等效于调用UIApplicationMain函数并将此类的名称作为委托类的名称传递。

这就是说,您可以将此属性用作在自定义类上调用UIApplicationMain函数的简写。 那该功能做什么呢?

main入口点调用此函数以创建应用程序对象和应用程序委托并设置事件周期。

在运行应用程序时,它需要知道从哪里开始执行代码。

可可触摸在UIApplicationDelegate的实现上使用@UIApplicationMain属性而不是main.swift文件来标记入口点。

由于在采用UIApplicationDelegate协议的AppDelegate上调用了“ @UIApplicationMain ”,这意味着AppDelegate充当了该应用程序的主要入口点。

现在,该应用程序知道从哪里开始,它创建的是UIApplication类型的单例 。 单例为在iOS中运行的应用程序提供了集中的控制和协调点。

然后,您的自定义类(AppDelegate)成为该UIApplication单例的委托 这个名字开始变得有意义了……

类声明

现在让我们看一下AppDelegate类的其余声明。 我们可以看到它是UIResponder的子类,并且采用了UIApplicationDelegate协议。 让我们看看赋予类的功能是什么……

首先让我们看一下UIResponder。

UIResponder类为响应和处理事件的对象定义一个接口。 它是UIApplicationUIView及其子类(包括UIWindow )的超类。 这些类的实例有时称为响应者对象,或简称为响应者。

一般有两种事件:触摸事件和运动事件。 触摸的主要事件处理方法是touchesBegan(_:with:)touchesMoved(_:with:)touchesEnded(_:with:)touchesCancelled(_:with:) 。 这些方法的参数将触摸与其事件相关联(尤其是新的或已更改的触摸),因此,当所传递的事件在多点触摸序列的各个阶段中进行时,响应对象可以跟踪和处理这些触摸。 每当手指触摸屏幕,在屏幕上拖动或从屏幕抬起时, UIEvent生成UIEvent对象。 事件对象包含针对屏幕上所有手指或从屏幕上抬起的所有手指的UITouch对象。

简而言之,让AppDelegate从UIResponder继承可使其与用户操作交互。

接下来让我们看看UIApplicationDelegate允许我们做什么。

UIApplicationDelegate协议定义了由单例UIApplication对象调用的方法,以响应应用程序生命周期中的重要事件。

所以……还记得在AppDelegate的声明之前为“ @UIApplicationMain ”如何为我们的应用创建单例UIApplication并指定AppDelegate作为该单例的委托吗? 现在,我们正在使用UIApplicationDelegate协议为我们提供控制单例所需的所有功能!

让我们看一下其中一些功能是什么

这里只是一些-但您应该注意到这些外观有点像视图生命周期中的功能。 这意味着您可以调用这些函数来在App Lifecycle的不同阶段实施操作。

在AppDelegate.swift文件中,它们甚至提供注释,以告诉您您可能想对其中某些方法进行处理。 例如,假设您返回主屏幕并需要该应用“进入背景”

附带说明-所有这些功能都标记为可选。 因此,您无需执行任何协议即可遵守该协议, 但是应用程序的主入口点必须采用此协议。

最后一件事-UIWindow 变量

UIWindow对象为应用程序的用户界面提供了背景,并提供了重要的事件处理行为。 Windows本身没有任何视觉外观,但是它们对于呈现应用程序视图至关重要。 屏幕上出现的每个视图都被一个窗口包围,并且每个窗口都独立于应用程序中的其他窗口。 您的应用收到的事件最初会路由到适当的窗口对象,该对象随后将这些事件转发到适当的视图。 Windows与您的视图控制器配合使用以实现方向更改并执行许多其他操作,这些操作是应用程序操作的基础。

简而言之-如果没有UIWindow,您将看不到任何东西或与之交互。

默认的Main.storyboard将通过Xcode中的部署信息自动设置为与给定窗口一起使用。

但是,如果您不想使用情节提要,则需要以编程方式创建一个窗口,分配一个根UIViewController(初始视图控制器),然后显示该窗口。

您可以使用UIApplicationDelegate协议中的功能之一来执行此操作: application(_:didFinishLaunchingWithOptions :)-> Bool