View Controller Programming Guid for iOS 笔记

来源:互联网 发布:dnf一直网络连接中断 编辑:程序博客网 时间:2024/06/07 07:55

1.View Controller 根蒂根基
1.1 View Controller 分类
ViewController分为container view controller 和content view controller两种类型。
这两种类型只是用处不合,前者作为一个容器容纳其他的view controller,后者用来显示内容,代码上方差别不大。前者包含UINavigationViewController、 UITabBarViewController等,后者包含UITabViewController等。对于container而言,childViewControllers数组存放了所有的childViewController。viewController的父子关系与view的父子关系不一样,以UITabBarViewController为例,它可以有两个childViewController,但这两个childViewController的view,其subview并不是UITabBarViewController的view的sub view。


1.2显示一个ViewController的内容有以下几种办法
(1)将controller作为window的root controller
(2)将controller作为一个container controller的孩子
(3)present
不该该直接的将一个controller的view,放到另一个controller的子view里面,如许会引起题目。


2. 在App中应用View Controller
2.1 应用Story Board
2.2 用编程的体式格式显示View Controller的内容


3.创建自定义的Content View Controller
3.1 应用Storyboard来实现本身的View Controller
当应用Storyboard时:
(1)iOS主动初始化你的view controller
(2)须要重载awakeFromNib来完成初始化 
(3)在IB里面创建view体系已经其他相接洽关系对象。

当应用编程体式格式来设计view controller时
(1)应用alloc 和init对view controller进行初始化
(2)创建自定义的初始化函数进行初始化
(3)重载loadView来创建和设备view体系。

4.View Controller资料经管
4.1 初始化View Controller
4.1.1 初始化来自Storyboard的View Controller
履行次序为
- (id)initWithCoder:(NSCoder *)decoder
- (void)awakeFromNib
4.1.2 应用编程体式格式初始化View Controller
应用自定义的初始化函数来进行初始化,该函数应当调用super 的init函数

4.2 当View Controller的view被接见时,View Controller初始化它的view体系
履行次序为:
1. view controller调用它的loadView函数。在默认的loadView函数中,若view controller与storyboard是接洽关系的,loadView函数从storyboard中创建view对象,若view controller不与storyboard接洽关系,loadView函数创建一个UIView对象,并赋值给controller的view属性。
2. view controller调用它的viewDidLoad函数,从而容许子类做一些额外的加载工作。

4.2.1 从storyboard中加载Controller的view对象
4.2.2 用编程体式格式创建view对象
若是不消storyboard来创建Controller的view对象,那么应当重载viewController的loadView办法,以下面的步调来实现:
(1)创建view controller的root view对象。
(2)创建子view,并把他们add到root view中
(3)实现viewWillLayoutSubview和viewDidLayoutSubview来调剂subviews的size
(4)将root view赋值给viewController的view属性


4.3 有效的经管内存
在iOS 6之后 ,在didReceiveMemoryWarning函数中将手动self.view赋值为ni来开释内
在iOS 6以前, 体系会在调用了didReceiveMemoryWarning之后将view开释,并且调用viewWillUnload 和viewDidUnload函数 。
5.对显示有关的通知进行响应
当view显示出来之前,viewWillAppear会被调用
当view显示出来之后,viewDidAppear会被调用
可以在appear函数 中应用isBeingPresented可以断定该viewController是否是被present出来,应用isMovingToParentViewController函数可以断定该viewController是否因为被作为孩子加到一个容器controller里面而显示出出来。


当view消散之前,viewWillDisappear会被调用
当view消散之后’,viewDidDisappear会被调用
在disappear函数中应用isBeingDismissed可以断定该viewController是否是被dismiss掉,应用isMovingFromParentViewController来断定是否是从parent view controller中移除。


6.改变View Controller的view的大小
6.1 view controller是如何参与到view 布局过程中的
当view controller的view的size 改变时,它的subviews将被从头定位来适应新的空间。在view的size改变时,以下过程将产生:
(1)view controller的view 被改变为新的size
(2)若是没有效auto layout,subviews按照它们的autoresizing mask来改变大小。
(3)view controller的viewWillLayoutSubviews被调用
(4)view controller的view的layoutSubviews被调用,若是应用了auto layout,…
(5)viewController的viewDidLayoutSubviews被调用
幻想景象下,subviews们本身履行了重定位相干的工作,若是须要本身调剂subviews的地位,可以重载layoutSubview来调剂那些不克不及被经由过程resizing mask主动定位的sub view。


7.应用响应者链中的View Controller
8.支撑多个标的目标
8.1 iOS6今后的处理惩罚体式格式
当UIKit收到一个转向的通知时,它应用UIApplication 对象和app的root view controller来决意是否支撑新的标的目标。若是两个对象都赞成新的标的目标,则转向,不然通知被忽视。
当有一个viewController被present出来之后,这个被present出来的view controller被用来庖代root view controller来决意是否转向,同时,这个presented controller可以应用一个预置的标的目标。
view controller应用函数- (NSUInteger)supportedInterfaceOrientations来声明支撑的标的目标,应用preferredInterfaceOrientationForPresentation函数来声明默认的presented controller的标的目标。

若是临时禁用主动转向,重载最顶层的view controller的shouldAutorotate函数来返回NO,如许就不会主动转向。


8.2 iOS6以前的处理惩罚体式格式
应用的函数不一样,但机制一样,都是基于root view controller。
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)orientation

if ((orientation == UIInterfaceOrientationPortrait) ||
(orientation == UIInterfaceOrientationLandscapeLeft))
return YES;

return NO;
}
8.3 在当前显示的view controller中响应标的目标改变
当设备标的目标改变时,当前显示的view controller是会收到通知,并且被赐与一个机会来履行额外的任务。可以应用这些办法来显示或隐蔽views,从头定位views等等,但不要在此时履行耗时操纵。斗劲合适的处理惩罚是供给独特的views来适应不合标的目标,比如弹出一个新的view controller。
通知消息会被发送给root view controller,root view controller将这些events在须要的时辰传递给它的孩子,以下是扭转发送时事务的次序。
(1)window调用root view controller的willRotateToInterfaceOrientation:duration:函数。Container view controllers会降该消息发送给当前显示的content view controller。可以在本身的content view controller里面重载该函数来隐蔽某些view或者做些改变。
(2)window调剂view controller的view bound。这会导致view 从头布局subviews,触发controller的viewWillLayoutSubviews 函数。当这个函数运行时,可以按照app的 statusBarOrientation属性来断定当前的标的目标。
(3) view controller的willAnimateRotationToInterfaceOrientation:duration:函数被调用


(4)产活泼画
(5) didRotateFromInterfaceOrientation: 被调用。container view controller会发送该消息给当前显示的content view controller。

8.4 创建一个可选的横屏界面
若是在横屏时供给基于雷同数据的不合界面,最好的体式格式是应用两个零丁的controllers。一个经管横向界面,一个经管竖向界面。
实现办法为:
(1)实现两个view controller,一个只支撑横屏,一个只支撑竖屏
(2)注册UIDeviceOrientationDidChangeNotification 消息,在handler办法里面,基于当前的标的目标,present或者dismiss可选的view controller。

8.5 Tips for Implementing Your Rotation Code



9.Presenting View Controllers
10.在View Controllers之间进行调和
10.1.应用delegation与其他controller通信

10.2 经管controller 数据的领导方针
(1)一个目标view controller引用的数据应当来自其源view controller,除非它是一个自我设备的view controller
(2)老是应用delegation将信息返回其他controller,content view controller永远不须要知道源view controller或者不是由它创建出来view controller的信息
(3)避免不须要的连接到外部的view controller,每个连接代表的依附,使得它更难改变你的应用法度的设计。


11.应用View Controller的 编辑模式
12.创建自定义Segue
13.创建自定义Container View Controller
13.1 设计本身的Container View Controller
13.2 通用Container View Controller典范
13.3 实现自定义Container View Controller
实现一个容器的目标是可以或许将其他view controller的view作为子树增长到当前容器controller的view体系中。当增长一个孩子controller的view时,你须要确保事务会被分发到响应的controller中,是以须要显式的将新的controller作为容器controller的的孩子。

13.3.1 增长或者移除一个孩子
(1)增长controller的例子
步调为:
调用 addChildViewController:将新的controller加到容器的孩子中,该函数会主动调用新controller的 willMoveToParentViewController函数
设置新controller的view的frame
将新的controller的view加到container的view体系中(不必然是container的root view) 
调用新controller的didMoveToParentViewController函数
典范代码为:


- (void) displayContentController: (UIViewController*) content;
{
[self addChildViewController:content]; // 1
content.view.frame = [self frameForContentController]; // 2
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self]; // 3
}
(2)移除controller的孩子
步调为:
调用孩子的willMoveToParentViewController:
移除view
调用孩子的removeFromParentViewController ,将孩子安闲器中移除,该函数会主动调用didMoveToParentViewController:
典范代码为:
- (void) hideContentController: (UIViewController*) content
{
[content willMoveToParentViewController:nil]; // 1
[content.view removeFromSuperview]; // 2
[content removeFromParentViewController]; // 3
}

以下代码演示了在两个viewController之间进行切换:
- (void) cycleFromViewController: (UIViewController*) oldC
toViewController: (UIViewController*) newC
{
[oldC willMoveToParentViewController:nil]; // 1
[self addChildViewController:newC];

newC.view.frame = [self newViewStartFrame]; // 2
CGRect endFrame = [self oldViewEndFrame];

[self transitionFromViewController: oldC toViewController: newC // 3
duration: 0.25 options:0
animations:^{
newC.view.frame = oldC.view.frame; // 4
oldC.view.frame = endFrame;
}
completion:^(BOOL finished) {
[oldC removeFromParentViewController]; // 5
[newC didMoveToParentViewController:self];
}];
}
13.3.2 自定义外观和扭转回调行动
13.3.2 建树容器controller的实际建议

0 0
原创粉丝点击