一.View Controller Classes

二.自定义UIVIewController

1.创建

a)nib文件

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3. self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
  4. // Override point for customization after application launch.
  5. self.firstViewController = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease];
  6. self.window.rootViewController = self.firstViewController;
  7. self.firstViewController.wantsFullScreenLayout=YES;
  8. [self.window makeKeyAndVisible];
  9. return YES;
  10. }

如果你自定义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来通知不同的状态。

  1. @implementation PortraitViewController
  2. - (void)awakeFromNib
  3. {
  4. isShowingLandscapeView = NO;
  5. [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
  6. [[NSNotificationCenter defaultCenter] addObserver:self
  7. selector:@selector(orientationChanged:)
  8. name:UIDeviceOrientationDidChangeNotification
  9. object:nil];
  10. }
  11. - (void)orientationChanged:(NSNotification *)notification
  12. {
  13. UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
  14. if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
  15. !isShowingLandscapeView)
  16. {
  17. [self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];
  18. isShowingLandscapeView = YES;
  19. }
  20. else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
  21. isShowingLandscapeView)
  22. {
  23. [self dismissViewControllerAnimated:YES completion:nil];
  24. isShowingLandscapeView = NO;
  25. }
  26. }

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

  1. FCDemoViewController *controller= [[FCDemoViewController alloc]initWithNibName:@"FCDemoViewController" bundle:nil];
  2. controller.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
  3. [self presentModalViewController:controller animated:YES];
  4. NSLog(@"%@",self.modalViewController);
  5. //5.0
  6. [self presentViewController:controller animated:YES completion:nil];
  7. NSLog(@"%@",self.presentedViewController);
  8. 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的话代码如下

    1. myViewController.navigationItem.rightBarButtonItem=[myViewController editButtonItem];

UIViewController简述的更多相关文章

  1. iOS开发路线简述

    1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...

  2. 简述组件化解决方案CTMediator与MGJRouter的主要思想

    简述CTMediator   CTMediator按照功能的结构来讲,使用时需要实现CTMediator的个三部分. 1.CTMediator类:承担总枢纽,总调度的责任 2.Target_(Modu ...

  3. UIViewController生命周期-完整版

    一.UIViewController 的生命周期 下面带 (NSObject)的方法是NSObject提供的方法.其他的都是UIViewController 提供的方法. load   (NSObje ...

  4. 拦截UIViewController的popViewController事件

    实现拦截UIViewController的pop操作有两种方式: 自定义实现返回按钮,即设置UIBarButtonItem来实现自定义的返回操作. 创建UINavigatonController的Ca ...

  5. 简述 OAuth 2.0 的运作流程

    本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...

  6. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  7. iOS: 在UIViewController 中添加Static UITableView

    如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ...

  8. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  9. 8. UIViewController

    1. UIViewController 的认识 UIViewController在iOS开发中占据很重要的位置,iOS的整个UI开发的核心思想也是MVC的架构,从UIViewController的命名 ...

随机推荐

  1. UVa 1630 串折叠

    https://vjudge.net/problem/UVA-1630 题意: 给出一个由大写字母组成的长度为n的串,折叠成一个尽量短的串.例如:AAAAAAAAABABABCCD折叠成9(A)3(A ...

  2. Axure RP 8.0 Licence

    新版本:(比如 Axure RP 8.0.0 3319)Licensee:米 业成 (STUDENT)Key:nFmqBBvEqdvbiUjy8NZiyWiRSg3yO+PtZ8c9wdwxWse4W ...

  3. Elasticsearch 多字段搜索

    查询很少是对一个字段做 match 查询,通常都是一个 query 查询多个字段,比如一个 doc 有 title.content.pagetag 等文本字段,要在这些字段查询含多个 term 的 q ...

  4. 基于Java的三种对象持久化方式

    1:序列化技术: 序列化的过程就是将对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,可以通过管道或线程读取,或通过网络连接将对象 ...

  5. 机器学习 MLIA学习笔记(三)之 KNN(二) Dating可能性实例

    这是个KNN算法的另一实例,计算Dating的可能性. import numpy as np import os import operator import matplotlib import ma ...

  6. python 递增递减数列

    def is_arithmetic(l): delta = l[] - l[] ): ] - l[index] == delta): return False return True print(is ...

  7. Windows 上安装 MySQL

    Windows 上安装 MySQL https://www.mysql.com/downloads/ 1.下载MySQL安装包(官网下载链接): 选择 DOWNLOADS ——> Communi ...

  8. Java 常用对象-String类

    2017-11-02 20:02:06 String:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能 ...

  9. ISO 8859-1 对照表 (扩展ASCII码表)

    1. 0---127 是ASCII码 2.128--255 加了一些特殊符号 DEC OCT HEX BIN Symbol HTML Number HTML Name Description 128 ...

  10. 3-30 flash(api),rescue_from(); logger简介

    ActionDispatch::Flash < Objec pass temporary primitive-types (String, Array, Hash) between action ...