怎么重写ios loadvieww ios

ios – 视图控制器如何管理视图?
原文:/Aion/p/4106097.html
移动设备的屏幕有限,所有的东西都需要放到一个单一窗口组成的单一界面显示,在ios中体现为视图切换(在《》中已经说明了视图),当一个视图替换掉另一个视图的时候,会经常使用动画效果,这个任务就是交给视图管理器来完成的。
ios5之后应用程序窗口有一个根视图控制器(rootViewController),当不为rootViewController赋值时,会出现“Application windows are expected to have a root view controller at the end of application launch”警告。
1. 视图控制器的实例化方式
视图控制器的实例化也有几种方式:
第一种: 代码,也是我最喜欢的一种,不是因为它简单,是因为使用代码会使得程序的结构变得清晰简单 更易懂。
[[ViewController alloc] init];
[[ViewController alloc]initWithNibName:@&xibName& bundle:nil];
第二种:代理类加载xib
1 . xib文件里面需要一个ViewController,并将xib的 File's Owner的Identity inspector中的class设置为应用程序代理类。
2 . 代理类中添加一个ViewController插座变量并连接。
3 . 在application:didFinishLaunchingWithOptions:方法中加载xib文件。
第三种:串联图
2.视图控制器如何创建视图
UIViewController中有loadView这个方法,默认情况下,自己的视图控制器并没有重写这个方法,本人测试过,当第一次访问view这个属性的时候,就会自动调用loadView这个方法,重写这个方法,代码如下:
- (void)loadView{
self.view = [[UIView alloc] init];
跟不重写一样的效果,所以本人就猜想UIViewController中loadView这个方法也是如此实现(没有使用xib的情况下),欢迎指正。
3.view的生命周期
UIViewController中声明如下方法:
//加载视图
- (void)loadV
//j将要卸载视图
- (void)viewWillUnload NS_DEPRECATED_IOS(5_0,6_0);
//已经卸载视图
- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0);
//已经加载
- (void)viewDidL
//视图将要显示
- (void)viewWillAppear:(BOOL)
//视图已经显示
- (void)viewDidAppear:(BOOL)
//视图将要隐藏
- (void)viewWillDisappear:(BOOL)
//视图已经隐藏
- (void)viewDidDisappear:(BOOL)
//将要调用layoutSubviews
- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0);
//已经调用layoutSubviews
- (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0);
可以重写这些方法进行生命生命周期的管理。
视图控制器的一个主要任务就是知道如何旋转视图,有两种不同旋转:
应用的旋转是为了抵消设备方向的旋转,从而应用可以根据用户如何手持设备而正确的显示。抵消旋转的挑战仅仅在于屏幕不是正方形,这意味着,如果应用旋转90度,界面不再适合屏幕,必须做出改变进行抵消。
当某个特定的视图出现在上界面上时应用进行旋转,或者在应用启东时,为了告诉用户需要旋转设备才能正确显示视图。这是很常见的,因为界面是特地的设计的,而屏幕并不是正方形,所以事实上只能显示某一特定的模式(竖屏或横屏)。
为了支持旋转,视图控制器需要做的事就是重写shouldAutorotateToInterfaceOrientation:,传入的参数是当前设备的方向,是如下之一:
UIInterfaceOrientationPortrait& Home健在下方
UIInterfaceOrientationPortraitUpsideDown& Home健在下方
UIInterfaceOrientationLandscapeLeft& Home健在左边
UIInterfaceOrientationLandscapeRight& Home健在右边
返回YES允许所有方向旋转,否则返回NO,如果没有重写这个方法,默认是对UIInterfaceOrientationPortrait& 返回YES,而其他方向返回NO的,必须对某些方向返回YES。(没有UIViewController属性可以设置为视图控制器可旋转的方向,只能重写这个方法)。
iOS 5有一个新特性,就是shouldAutorotateToInterfaceOrientation可以动态的实现, 使用attemptRotationToDeviceOrientation这个方法
该方法的使用场景是 interface orientation和device orientation 不一致,但希望通过重新指定 interface orientation 的值,立即实现二者一致;如果这时只是更改了支持的 interface orientation 的值,没有调用attemptRotationToDeviceOrientation,那么下次 device orientation 变化的时候才会实现二者一致,关键点在于能不能立即实现。
举个例子:
假设当前的 interface orientation 只支持 Portrait,如果 device orientation 变成 Landscape,那么 interface orientation 仍然显示 Portrait;
如果这时我们希望 interface orientation 也变成和 device orientation 一致的 Landscape,以iOS 6 为例,需要先将 supportedInterfaceOrientations 的返回值改成Landscape,然后调用 attemptRotationToDeviceOrientation方法,系统会重新询问支持的 interface orientation,已达到立即更改当前 interface orientation 的目的。
可以通过视图控制器的interfaceOrientation属性知道当前界面的方向, UIViewController的子类可以重写下列方法,以便在旋转的前后收到通知:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
您可能也会对以下文章感兴趣
QQ : 341470
Friend Link
New Member扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
iOS学习笔记(六)——ViewController
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口19790人阅读
首先先阐明ViewController的职责:对内管理与之关联的View,对外跟其他ViewController通信和协调。对于与之关联的View,ViewController总是在需要的时候才加载视图,并在不需要的时候卸载视图,所以也同时担当了管理应用资源的责任。理解ViewController的LifeCycle(生命周期),能够有效地管理应用资源。
ViewController的初始化:
从Storyboards中加载的时候,会调用initWithCode,如果不存在则调用init。之后对里面的每个对象调用awakeFromNib方法。
从内存中alloc出来的情况下,调init方法。
ViewController查找与其关联的view,其顺序是:
1 先判断子类是否重写了loadView,如果有直接调用。之后调viewDidLoad完成View的加载。
2 如果是外部通过调用initWithNibName:bundle指定nib文件名的话,ViewController记载此nib来创建View。
3 如果initWithNibName:bundle的name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib。
A 如果类名包含Controller,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
B 找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib。
4 &如果子类没有重写的loadView,则ViewController会从StroyBoards中找或者调用其默认的loadView,默认的loadView返回一个空白的UIView对象。
注意第一步,ViewController是判断子类是否重写了loadView,而不是判断调用子类的loadView之后ViewController的View是否为空。就是说,如果子类重写了loadView的话,不管子类在loadView里面能否获取到View,ViewController都会直接调viewDidLoad完成View的加载。
ViewController的卸载View的步骤:
1 系统发出内存警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
2 如果此时view没有被加入到任何视图树上,则调用viewWillUnload之后释放View
3 调用viewDidUnload
注意view的Load和Unload不是成对调用的。
因为viewWillUnload和viewDidUnload这两个函数只在内存警告时被调用。
就算强制将viewController的view设为nil也不会触发。
如果viewController从创建到销毁期间都没有内存警告,那么这两个函数将始终不会被调用。
iOS6已将viewWillUnload和viewDidUnload废弃,原因是UIKit在内存警告的时候已经不会自动释放无用的视图。
& & 由于Controller加载View时,会自动将一些View对象指向其对应的IBOutlet变量。
所以当view被卸载时我们必须在viewDidUnload将这些变量release掉,ViewController不会自动做这件事。
具体做法是将变量设置为空,(注意和dealloc中将变量release的区别)注意此时Controller的view属性是空的。
在ViewController的生命周期的各个阶段,我们都有责任去适当的创建和销毁对象,具体各个阶段要做的事情,见官方文档的表
注:本文中的ViewController即视图控制器,根类是UIViewController。View是视图,根类是UIView。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:70105次
积分:1090
积分:1090
排名:第17561名
原创:36篇
评论:50条
(1)(1)(1)(2)(1)(1)(1)(7)(1)(8)(4)(1)(1)(1)(2)(13)}

我要回帖

更多关于 ios loadview 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信