UIViewController简述
一.View Controller Classes
二.自定义UIVIewController
1.创建
a)nib文件
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
- // Override point for customization after application launch.
- self.firstViewController = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease];
- self.window.rootViewController = self.firstViewController;
- self.firstViewController.wantsFullScreenLayout=YES;
- [self.window makeKeyAndVisible];
- return YES;
- }
如果你自定义controller实现initWithCoder:方法的话则会调用,如果没有实现,则调用init.
在调用完后,框架会自动调用controller中的objects(一般是UIView)的awakeFromNib方法,让objects可以有机会来初始化自己.
b)手动创建
只需要alloc&init方式就可以了
2.初始化
一般在controller中实现loadView方法来实现第一次的controller内容的管理,值得注意的是,如果自己实现了这个方法,则不需要调用super的loadView方法
3.设置root view controller的尺寸
a)window的尺寸
b)是否有status bar
c)设备的方向(横向竖向)
d)root view controller的wantsFullScreenLayout属性。这个属性就是设置是否要包含状态栏20像素,比方说你在view里设置了一个button在顶部,这个如果是true,则button出现在状态栏下,如果是false,则会自动顶下去。本身并不影响status bar的隐藏和消失。只是决定status bar下面是否属于程序绘制区域而已。
4.布局
首先可以利用每个view的autoresizingMask的设置来自动布局
viewcontroller布局改变的顺序
a)view controller的vew尺寸改变
b)调用controller的viewWillLayoutSubview.
c)调用view的layoutSubview
d)调用controller的viewDidLayoutSubview.
三.View Controller的生存周期
1.初始化方法:init,initWithCoder;
2.加载controller's view:loadView: controller.view=nil; viewDidLoad: controller.view=view;
3.当收到didREceiveMemoryWarning的时候会调用viewWillUnload,viewDidUnload;
4.dealloc:释放资源(ARC可以忽略)
四.支持界面旋转
1.声明支持的旋转方向
shouldAutorotateToInterfaceOrientation:决定支持的旋转方向(UIInterfaceOrientationIsLandscape的横向2个方向 UIInterfaceOrientationIsPortrait竖直2个方向)
2.如何处理方向改变
a)方向发生改变
b)调用shouldAutorotateToInterfaceOrientation查看支持的方向
c)调用controller的willRotateToInterfaceOrientation:duration方法
d)触发view的自动布局(详细的看第二部分的第4点:布局)
e)调用didRotateFromInterfaceOrientation方法
3.为每个方向创建不同的界面
利用notification来通知不同的状态。
- @implementation PortraitViewController
- - (void)awakeFromNib
- {
- isShowingLandscapeView = NO;
- [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(orientationChanged:)
- name:UIDeviceOrientationDidChangeNotification
- object:nil];
- }
- - (void)orientationChanged:(NSNotification *)notification
- {
- UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
- if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
- !isShowingLandscapeView)
- {
- [self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];
- isShowingLandscapeView = YES;
- }
- else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
- isShowingLandscapeView)
- {
- [self dismissViewControllerAnimated:YES completion:nil];
- isShowingLandscapeView = NO;
- }
- }
4.处理旋转的小贴士
a)暂时禁止任何事件响应
b)存储已经显示的地图区域(地图应用中)
c)如果界面的view层次太过复杂而造成延迟,建议先做view的截图,相关方法我其它博客文章中有提到
d)旋转后,对于tableView的话,需要reload重新读取数据。
e)使用旋转通知来更新应用信息。
五.view显示相关的通知
1.方法有viewWillAppear: viewDidAppear: viewWillDisappear: viewDidAppear:
2.注意这个是controller.view被设置值或者controller.view被设置成nil调用的,当然这个值未必就是直接设置的,可能是通过controller的显示和移除的。
3.知道view显示移除的原因,在上述4个方法中调用isMovingFromParentViewController,isMovingToParentViewController,isBeingPresented,isBeingDismissed 。
六.viewController显示(关闭)其它viewController
在5.0之前,对应的方法是使用model view controller系列的方法。5.0以后增加了presented,prensentingViewController的概念,modalViewController对应5.0后的presentedViewController
- FCDemoViewController *controller= [[FCDemoViewController alloc]initWithNibName:@"FCDemoViewController" bundle:nil];
- controller.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
- [self presentModalViewController:controller animated:YES];
- NSLog(@"%@",self.modalViewController);
- //5.0
- [self presentViewController:controller animated:YES completion:nil];
- NSLog(@"%@",self.presentedViewController);
- NSLog(@"%@",self.presentingViewController);
属性modalPresentationStyle在iPad下有几种显示形式,对应不同的显示区域。属性modellTransitionStyle决定过渡形式.
关闭也有对应的方法:dismissModalViewControllerAnimated或iOS5.0以后的dismissViewControllerAnimated:completion:
5.0以后其它的变化:
controller可以自定义子controller的集合,这样每一个controller都可以是一个container controller.
definesPresentationContext决定当前显示其它controller的controller是否提供context给presentedViewController(modalViewController),如果不,就会找上一级的controller的该值。
详细的操作可以查看class reference.
苹果官方推荐使用协议的方式来让controller相互通信。首先声明一个协议,并在主controller中实现该协议的方法,在显示其它controller的时候,为其设置delegate=self.这样在其它controller需要回调presentingViewController就可以直接用delegate方法来回调到它。通过这样的方式,可以使得复用性大大增强。而且被显示的controller也不用完全知道显示它的controller的所有信息和属性。
七.controller的edit mode
1.当设置controller的editing属性,会自动触发setEditing:animated属性,这个时候通过myController editButtonItem获得的编辑按钮会自动从edit变成Done,这个通常使用在navigation Controller
比如设置一个右上角按钮为editButton的话代码如下
- myViewController.navigationItem.rightBarButtonItem=[myViewController editButtonItem];
UIViewController简述的更多相关文章
- iOS开发路线简述
1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...
- 简述组件化解决方案CTMediator与MGJRouter的主要思想
简述CTMediator CTMediator按照功能的结构来讲,使用时需要实现CTMediator的个三部分. 1.CTMediator类:承担总枢纽,总调度的责任 2.Target_(Modu ...
- UIViewController生命周期-完整版
一.UIViewController 的生命周期 下面带 (NSObject)的方法是NSObject提供的方法.其他的都是UIViewController 提供的方法. load (NSObje ...
- 拦截UIViewController的popViewController事件
实现拦截UIViewController的pop操作有两种方式: 自定义实现返回按钮,即设置UIBarButtonItem来实现自定义的返回操作. 创建UINavigatonController的Ca ...
- 简述 OAuth 2.0 的运作流程
本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...
- JavaScript单线程和浏览器事件循环简述
JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...
- iOS: 在UIViewController 中添加Static UITableView
如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- 8. UIViewController
1. UIViewController 的认识 UIViewController在iOS开发中占据很重要的位置,iOS的整个UI开发的核心思想也是MVC的架构,从UIViewController的命名 ...
随机推荐
- 【Android实验】 UI设计-ListView
目录 实验目的 实验要求 实验内容 实现效果 实验代码 实验总结 实验目的 学习使用ListView 学习使用menu 实验要求 实现一个列表,其中显示班级学号姓名,提供添加功能,如需要删去某一项,长 ...
- poj 2385 Apple Catching 基础dp
Apple Catching Description It is a little known fact that cows love apples. Farmer John has two ap ...
- Java使用Log4记录日志
我们在系统使用中,为了方便查找问题,因此需要记录操作的日志,而目前比较成熟稳定的程序日志记录方式就是Log4,本人也是菜鸟,然后再学习研究中就记录一下使用方式,以方便今后查阅,同时本文章参考了博客园: ...
- 发票查验---异步处理多条记录---demo代码
/// 窗体加载事件 /// </summary> /// <param name="obj"></param> ...
- WPF样式——经典博客
WPF样式博客:http://www.cnblogs.com/luluping/archive/2011/05/06/2039498.html
- mtime 的具体解释
find . -mtime +0 # find files modified greater than 24 hours ago find . -mtime 0 # find files modifi ...
- 微信小程序------MD5加密(支持中文和不支持中文)和网络请求(get和post)
开发中常常遇到MD5加密,最近做小程序也用到了,简单总结了一下: 这要有两个加密文件,一个不支持中文,一个支持,所以你选择支持的来用就行了: 也随便说说小程序的get和post网络请求. 来看看效果图 ...
- Population Size CodeForces - 416D (贪心,模拟)
大意: 给定$n$元素序列$a$, 求将$a$划分为连续的等差数列, 且划分数尽量小. $a$中的$-1$表示可以替换为任意正整数, 等差数列中必须也都是正整数. 贪心策略就是从前到后尽量添进一个等差 ...
- Spring web flow的意义
为什么要使用Spring web flow呢? 这里需要强调的一点就是,但凡一个技术的出现和流行,必有其适用的环境和存在的意义. Spring web flow加强了中央集权,这个该怎么理解呢?以往我 ...
- ural Ambitious Experiment 树状数组
During several decades, scientists from planet Nibiru are working to create an engine that would all ...