一篇关于loadview的文章。介绍的比较详细容易懂。
来源:互联网 发布:vb语言入门教程 编辑:程序博客网 时间:2024/04/25 02:31
loadview:
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设置为正确的状态
- 一篇关于loadview的文章。介绍的比较详细容易懂。
- 一篇关于Vim详细介绍的文章
- 一篇对H.323协议介绍比较详细的文章
- 转贴一篇介绍正则表达式比较详细的文章
- 转载一篇比较详细介绍rails routes的文章
- 转一篇比较详细介绍FatFs文件系统移植的文章
- 转一篇比较详细介绍FatFs文件系统移植的文章
- 转一篇比较详细介绍FatFs文件系统移植的文章
- 转一篇比较详细介绍FatFs文件系统移植的文章
- 转一篇比较详细介绍FatFs文件系统移植的文章
- 转一篇比较详细介绍FatFs文件系统移植的文章
- 转一篇比较详细介绍FatFs文件系统移植的文章
- [转]一篇关于 Animation 的文章,参数介绍很详细!
- 一篇关于RTP介绍比较全的文章
- 一篇详细介绍GITHUB的文章--GotGitHub
- 转一篇比较详细介绍FatFs文件系统移植的文章 FatFs文件系统的移植
- 转发一篇关于ANSI,Unicode,UTF-8编码的文章,我认为是最容易动的,最详细的
- 一篇关于mysql比较好的文章
- NSFileHandle目前木有用到。。保存下。。
- 五个值得关注的图形数据库
- mfc扩展dll的调用以及dll中creat出错分析
- Struts2框架web.xml的<filter-class>,FilterDispatcher和StrutsPrepareAndExecuteFilter
- 几种常用英文信件范文
- 一篇关于loadview的文章。介绍的比较详细容易懂。
- 职场江湖论:教你30岁前如何挣够500万
- 编译Android源码和Linux内核源码时候遇到的一些错误
- 浮点数编程易出现错误
- 网上转的^^可以看看…………
- SVN 提交出错:Attempted to lock an already-locked dir
- 懒于奋斗的躯体是徒有虚名的摆设,懒于思考的大脑是寸草不生的荒漠
- Windows Mobile 编译的内部结构和步骤
- Oracle 笔试总汇