loadview:

//   有没有nib 只要是复写了loadview loadview都会被执行     有nib文件的话加载的是nib文件的view  没有的话会按照loadview里的代码加载

也就是说程序先会执行loadview方法,然后再去加载nib文件。

UIViewController类或其子类会在初始化时创建一个UIView对象,会作为控制器的默认视图显示出来,可以通过self.view寻址访问。但没有调用loadView方法时,self.view=nil。loadView 在每一次使用self.view这个property,并且self.view为nil的时候被调用,用以产生一个有效的self.view。这个接口原 本是为了让我们自定义view用的。你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到didReceiveMemoryWarning的消息。 默认的实现是检查当前控制器的view是否在使用。 如果它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新的view。

[super loadView]的效果,就是产生了一个有效的view,也就是一个空白的view来保证view在使用时不为nil,但这并不是Cocoa的设计者所期望的。

loadView仅仅应该在开发者希望自行通过编码而不是Interface Builder定制view的时候被实现,而且不应该在其中调用[super loadView],你的loadView中应该有self.view = …这样的行为。

看两个例子:

例子1、

-(void) loadView {

//[super loadView];

NSLog(@"loadView Called");

}

- (void) viewDidLoad {

[super viewDidLoad];

UIButton *customButton = [UIButton buttonWith.....

......

[self.view addSubView:customButton];

}

当 不使用IB来创建视图的时候,在viewDidLoad中使用view之前,系统会自动调用loadView来创建一个view,但例子1中的 loadView除了打印一句话之外什么都没干,所以loadView会被不同的调用,但程序仍不能正常运行,因为没有有有效的 view,self.view的值始终为nil。注意:我没有调用[super loadView],如果加上这句就可以了,这样会产生一个空白的view,但这不是苹果希望的。

例子2、

- (void)loadView

{

[super loadView];

textView=[ [ UITextView alloc ] initWithFrame: [[ UIScreen mainScreen ] applicationFrame];

textView.text=@"Hello";

[self.view addSubview: textView];

}

- (void)loadView

{

textView=[ [ UITextView alloc ] initWithFrame: [ [ UIScreen mainScreen ] applicationFrame ] ];

textView.text=@"Hello";

self.view=textView;

}

两 段代码起到的作用相同,但前一个例子把textView加入到self.view中,而后者则让self.view直接指向了 textView。把textView加入到self.view中则self.view不能为nil,因此需要调用[super loadView]方法,后者不需要。

显然,继承UIViewController的subclass要实现其load方法时,若采用添加view的方式,我们只要在loadView中增加一句[super loadView]就没有问题了。但这并不是Cocoa的设计者所期望的。self.view = …才是提倡的方式。

看了一些大侠的帖子,有这么说的:

{当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。

如果手工维护views,必须重载重写该方法

如果使用IB维护views,必须不能重载重写该方法}

开始时对上述感觉很迷惑,我想这不是他想表达的本意

self.view = [[[NSBundle mainBundle] loadNibNamed:@"OneNibName" owner:self options:nil] lastObject];

我想在loadView中这样用也是可以的,我是手工维护view,但view是从IB中加载的。

还有一点,和loadView一个界别的还有一个方法initWithNibName, 这个方法是在controller中的类在IB中创建,但是通过Xcode实例化controller的时候用的.(建立一个viewBase的模板工 程,然后打开MainWindow.xib,删除其中的viewController,然后回到viewController.m中,把第一个方法 initWithNibName注释取消掉,然后加入一条你喜欢的打印语句,试试是不是这样的)

一般的用法是在loadView/initWithNibName里面创建基本的界面,然后在viewDidLoad里读入数据,然后根据数据再将各view设置为正确的状态。

 

最新文章

  1. define与typedef 区别
  2. Akka学习博客
  3. (BFS)hdoj1242-Rescue
  4. 项目经验之:GIS的初步工作窗体的搭建
  5. PHP开发搜索引擎技术全解析
  6. uva 624 CD 01背包打印路径
  7. H3 BPM 笔记
  8. Jquery:强大的选择器<一>
  9. keep健身计划
  10. Hadoop-2.2.0中文文档—— MapReduce下一代- 可插入的 Shuffle 和 Sort
  11. Linux学习——yum学习和光盘yum源搭建
  12. Django子应用里的通用类混合视图处理
  13. 当前标识没有对“C:\WINDOWS\Microsoft.NET\...”的写访问权限的解决办法
  14. windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速
  15. File /hbase/.tmp/hbase.version could only be replicated to 0 nodes instead of minReplication (=1).
  16. 尚硅谷面试第一季-09SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢
  17. win10和ubuntu16.04双系统Geom Error
  18. java成员变量和局部变量的初始化和内存中的运行机制
  19. 类的"魔法"方法
  20. 如何将Ajax请求从异步改为同步

热门文章

  1. JQUERY 选择
  2. crawler_如何从页面获取新浪cookie
  3. C++拷贝构造函数具体解释
  4. 无废话WCF入门教程五[WCF的通信模式]
  5. 前端学习笔记(zepto或jquery)——对li标签的相关操作(五)
  6. [Elasticsearch] 分布式文件存储
  7. JS对text非空判断,非空校验
  8. 使用Row_Number()分页优化
  9. sql点滴42—mysql中的时间转换
  10. CodeSmith