在iOS的原生开发中,我们需要特别关注两个东西:AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示:
AppDelegate是应用程序委托对象,它继承了UIResponder类,并实现了UIApplicationDelegate委托协议。UIResponder类可以使子类AppDelegate具有处理响应事件的能力,而UIApplicationDelegate委托协议使AppDelegate能够成为应用程序委托对象,这种对象能够响应应用程序的生命周期,该类中继承的一系列方法在应用生命周期的不同阶段会被回调。相应的,AppDelegate的子类也可以实现这两个功能。
ViewController类继承自UIViewController类,它是视图控制器类,在工程中扮演者根视图和用户事件控制类的角色。
应用程序生命周期
作为应用程序的委托对象,AppDelegate类在应用程序生命周期的不同阶段会回调不同的方法。首先,让我们先了解iOS应用的不同状态及其彼此间的关系。
- Not running(非运行状态)。应用没有运行或被系统终止。
- Inactive(前台非活动状态)。应用正在进入前台状态,但是还不能接受事件处理。
- Active(前台活动状态)。应用进入前台状态,能接受事件处理。
- Background(后台状态)。应用进入后台后,依然能够执行代码。如果有可执行的代码,就会执行代码,如果没有可执行的代码或者将可执行的代码执行完毕,应用会马上进入挂起状态。
- Suspended(挂起状态)。被挂起的应用进入一种“冷冻”状态,不能执行代码。如果系统内存不够,应用会被终止。
在应用状态跃迁的过程中,iOS系统会回调AppDelegate中的一些方法,并且发送一些通知。实际上,在应用的生命周期中用到的方法和通知很多,我们选取几个主要的方法和通知进行纤细介绍。
为了让大家更直观地了解各状态与其相应地方法、通知间地关系,下面我们以几个应用场景为切入点进行系统分析。
非运行状态——应用启动场景
点击Home键——应用退出场景
轻按两下Home键可以快速进入iOS(iOS9及其后续版本)多任务栏,此时可以看到处于后台运行或挂起状态地应用,也可能有处于终止状态地应用。向上滑动应用界面,可以删除这些应用并释放内存。
挂起重新运行场景
内存清除:应用终止场景
应用界面
苹果应用程序的界面几乎都是由Cocoa和Cocoa Touch框架中地类和协议等元素构建的,这些元素通过mvc模式有效地组织起来。
macOS应用的界面主要使用Cocoa框架开发,Cocoa是一种为应用程序提供丰富用户体验的框架,其核心是:Foundation和AppKit框架。iOS应用界面主要使用Cocoa Touch框架开发,核心是:foundation和UIKit框架。Cocoa Touch框架有一套自己的MVC模式,其中视图和控制器是UIKit中的UIView(及其子类)和UIViewController(及其子类)。
视图的生命周期
在应用运行过程中视图会显示不同的状态,这就是视图的生命周期。视图生命周期的不同阶段会回调视图控制器的不同方法。
视图创建并加载到内存中时,会调用viewDidLoad方法,这时视图并未出现。该方法中通常会对所控制的视图进行初始化处理。
视图可见前后会调用:viewWillAppear和viewDidAppear方法,视图不可见前后会调用viewWillDisappear和viewDidDisappear方法。这4个方法调用父类相应的方法以实现其功能,编码时调用父类方法的位置可根据实际情况做调整。
viewDidLoad方法在应用运行的时候只调用一次,二上述4个方法可以被反复调用多次。
视图
在Cocoa Touch框架中,提供了视图的“根”类——UIView。
从继承关系上看,UIView是所有视图的“根”。
其中,比较特殊的类是UIControl类,该类是控制类,它及其子类都能响应一些高级事件(可以通过xcode中的sent events栏来查看控件是否有高级事件)。,除此之外的类都无法响应高级事件。事实上,视图也可以响应事件,但是这些事件比较低级,需要开发人员自己处理。很多手势的开发都以这些低级事件为基础。
-
视图分类
- 控件。继承UIControl类,能够响应用户高级事件。
- 窗口。UIWindow对象。一个iOS应用只有一个UIWindow对象(这点和Android就有很大的区别了,Android是一个activity就持有一个window对象,换句话说一个Android应用是有多个window对象的),它是所有子视图的“根”容器(这点就和Android一致)。
- 容器视图。包括UIScrollView、UIToolbar及它们的子类。
- 显示视图。UIImageView、UILabel等。
- 文本和web视图。
- 导航视图。为用户提供从一个屏幕到另一个屏幕的导航(或跳转)视图,包括UITabBar和UINavigationBar。
- 警告框和操作表。用于给用户提供一种反馈或者与用户进行交互。
-
应用界面构建层次
iOS应用界面是由若干个视图构建而成的,这些视图对象采用树形构建。下图是一个应用界面的构建层次图,该应用有一个UIWindow,其中包含一个UIView根视图。根视图下又有3个子视图——Button1、Label2和UIView(View2),其中子视图UIView(View2)中存在一个按钮Button3。
一般情况下,应用中只包含一个UIWindow。从UI构建层次上讲,UIWindow包含一个根视图UIView。根视图一般也只有一个,放于UIWindow中。根视图的类型决定了应用程序的类型。
应用界面的构建层次是一种树形结构,“树根”是Window,RootView根视图是“树干”,其他视图对象为“树冠”。在层次结构中,上下两个视图是“父子关系”。除了Window,每个视图的父视图有且只有一个,子视图可以有多个。它们间的关系涉及3个属性。 -
superview。获得父视图对象。
-
subviews。获得子视图对象集合。
-
window。获得视图所在的界面Window对象。