一、界面控制器
1.1、UIViewController
UIViewController属于MVC设计模式,其为弱藕合思想衍生的构架。图如下:
设计模式有很多种,分别为:MVC(Model Controller View)
MVP(Model Presenter date binding View)
MVVM(Model View Model tow way data binding View)
ReactiveCocoa(ReactJS .Net Rx QT)
ViewController只是一个普通的Objective—C的对象,由类中的RootView管理众多的可显示控件。iOS 7后,需要为windos指定一个根视图控制器:self.window.rootViewController=ViewController;
上图为创建rootViewController的过程示意图,程序会进到Info.plist文件中查找:UIMainStoryboardFile属性,如果存在则加载,如果不存在再寻找NSMainNibFile属性,如果存在,则加载,如果不存在则,进入UIApplicationDelegatedidFinishLaunch方法中,寻找根视图控制器,如果没有则显示黑屏,代表没有找到根视图控制器。
ViewController的生命周期:
ViewController是单页面视图,是所有可显示界面控件的容器
1.2 Navigation
Navigation是解决需要多个ViewController交互的时,非层次化的工作流程。
Navigation的设计有固定的呈现方式,UINavigationController的视图顶部是叫UINavigationBar的控件,它继承了UIView控件,且通常只是作为多个UINavigationItem的容器,而且它以Stack的形式来管理多个UINavigationItem控件,这意味着导航条上每次只能看到一个UINavigationItem对象。
在同一时刻,UINavigationBar只能看到最上面的UINavigationItem,UINavigationBar最底层的控件被称为root UINavigationItem。
UINavigationItem作为一个容器,它由标题、左边N个按钮、右边N个按钮组成,每个按钮都是一个UIBarButtonItem控件。
其如下一些方法和属性
- pushNavigationItem:animated:该方法用于将一个UINavigation压入UINavigationBar栈中。
-popNavigationItemAnimated:该方法用于将UINavigationBar栈顶的UINavigationItem弹出栈
-setItems:animated:同时为UINavigationBar设置多个UINavigationItem控件。
.items:设置或返回UINavigationBar所包含的多个UINavigationItem控件。
.topItem:此为只读属性,用于返回UINavigationItem控件最顶层的UINavigationItem控件
.backItem:此为只读属性,用于返回UINavigationItem控件最顶层下面的UINavigationItem控件
.title:设置UINavigationItem的标题文本
.hidesBackButton:设置或返回是否显示后退按钮。如果将其值设为YES,就会隐藏火腿按钮
.titleView:设置货返回UINavigation的标题控件。如果设置了该属性,UINavigationItem将会使用自定义的标题控件。
.leftBarButtonItem:设置或返回UINavigationItem左边的多个按钮组成的数组
.leftBarButtonItem:该属性用语设置货返回UINavigationItem左边的单个按钮。
.rightBarButtonItem:设置或返回UINavigationItem右边的多个按钮组成的数组。
1.3 TabBar
当应用程序需要分成几个相对独立的部分时,可以考虑使用UITabBarController组合多个视图控制器,而UITabBarController将会在底部提供一个UItabBar,随着用户点击不同的标签顶,整个应用可以呈现完全不同的部分。
UITabBarController有两种创建方式:project直接选择Tabbed Application创建基于TabBar类型的iOS应用。
还可以选择editor下Embed In一个TabBar。
在故事版中创建一个TabBar,查看Tar Bar Item中有哪些可自定义的属性。
如果程序需要天添加更多的标签页,需要两步:
1、向Storyboard界面设计文件中添加一个新的视图控制器;
2、在UITabBarController与新的视图控制器之间建立segue。
二、故事版和App生命周期
2.1Interface Builder
Interface Builder是Xcode集成的界面设计工具,其极大的提高了程序员在创建界面时的效率,其宗旨是“所见即所得”
Storyboard的图形设计界面把整个视图、视图控制器、第一响应者组成和一个整体,这个整体被称为场景(Scene),此处的场景其实就对应一个窗口界面。也就是说,只要在一个窗口中看到的UIView和各种UI控件都被组合在场景中的UIViewController下,开发者就可以看到更好的组织层次关系。
Main.Storyboard可以包含整个项目的所有应用界面——即使项目包含多个视图控制器,所有的视图控制器对应的UIView也都将包含在Main.Storyboard。每个场景都包括一个视图控制器和First Responder两个对象,这是每个场景都拥有的两个特殊对象。First Responder代表当前正在与用户交互的对象。在应用程序生命周期内,随着用户与屏幕交互的变化,First Responder代表的控件会发生改变。假设有一个表单,当用户触摸表单中的某个文本域时,改文本域将成为活动文本域,它将会担当First Responder角色。
2.2 iOS应用的生命周期
我觉得首先应该知道iOS程序的几种状态
查阅资料了解到,iOS一共有5种状态,分别为如下几种:
1. Not running:应用还没有启动,或者应用正在运行但是途中被系统停止。
2. Inactive:当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。
3. Active:当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。
4. Background:应用处在后台,并且还在执行代码。大多数将要进入Suspended状态的应用,会先短暂进入此状态。然而,对于请求需要额外的执行时间的应用,会在此状态保持更长一段时间。另外,如果一个应用要求启动时直接进入后台运行,这样的应用会直接从Not running状态进入Background状态,中途不会经过Inactive状态。比如没有界面的应用。注此处并不特指没有界面的应用,其实也可以是有界面的应用,只是如果要直接进入background状态的话,该应用界面不会被显示。
5. Suspended:应用处在后台,并且已停止执行代码。系统自动的将应用移入此状态,且在此举之前不会对应用做任何通知。当处在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存告警时,系统将会将处于Suspended状态的应用清除出内存以为正在前台运行的应用提供足够的内存。(以上5段为摘抄,是官方文档的翻译)
接下来看看应用程序完整的生命周期流程图(以下为我原创图)。
其中:第一次初始化对应的方法是:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions