loadView的用法
来源:互联网 发布:惠普云计算 编辑:程序博客网 时间:2024/05/16 12:15
转载自http://haoxiang.org/2010/11/loadview-usage/
用UIViewController有一段时间了,才发现以前对loadView的理解完全不到位。
假如我们用Xcode新建一个View-based Application,在ViewController.m中加上
- (void) loadView {
NSLog(@"loadView Called");
}
再增加viewDidLoad,按照一般的情况,我们会有这样的Code
- (void) viewDidLoad {
[super viewDidLoad];
UIButton *customButton = [UIButton buttonWith.....
......
[self.view addSubView:customButton];
}
现在打开MainWindow.xib,删掉其中的ViewController,并在AppDelegate.m的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
里增加ViewController的初始化
viewController = [[XXXViewController alloc] init];
编译运行就有问题了。Console中不断的输出loadView Called!
仔细的阅读loadView的文档,才知道loadView不是这么用的。
loadView在每一次使用self.view这个property,并且self.view为nil的时候被调用,用以产生一个有效的self.view。这个接口原本是为了让我们自定义view用的。在不被subclass实现的情况下,也就是[super loadView]的效果,应该就是产生了一个有效的view,也就是一个空白的view。
在上面这种情况下,loadView被实现为空(只有一条打印语句),而且我们没有通过XIB初始化ViewController,所以在viewDidLoad被执行时,self.view是为nil的。所以在执行[self.view addSubView:customButton]时,loadView被调用,用来产生一个有效的view,使得self.view不再为nil。罢特,我们错了(-_-!)。我们的loadView什么也没有做,于是就出现了上面的情形,不断的调用一个什么都不做的loadView….
当然,我们只要在loadView中增加一句[super loadView]就没有问题了。但这并不是Cocoa的设计者所期望的。
loadView仅仅应该在开发者希望自行通过编码而不是Interface Builder定制view的时候被实现,而且不应该在其中调用[super loadView],你的loadView中应该有self.view = …这样的行为。
如果仅仅是想要在当前view上增加一些UIButton或是UILabel,应该在viewDidLoad里去做,此时不要实现自己的loadView。
应该没有非用loadView不可的地方吧,即使你不打算用xib初始化一个ViewController,也可以把加各种Subview的操作放在viewDidLoad里。
但是,如果你需要把self.view改成其他类型的view,比如UIImageView等等,这个时候把这种[self setView:XXview]的操作放在loadView更好一些。当然,用xib也可以实现。
- loadView的用法
- loadView的用法
- loadView的用法
- loadView的用法
- loadView的用法
- loadView的用法
- loadView 和 viewDidLoad的用法
- loadView和viewDidLoad的用法
- loadView用法
- loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
- loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
- init、loadView、viewDidLoad、viewDidUnload、dealloc的用法
- loadView、viewDidLoad、initWithNibName、awakeFromNib、initWithCoder的用法
- loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的用法
- loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
- loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的用法
- loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
- loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
- gdb多线程调试
- Struts2 Action配置通配符
- pppoe、webportaldot1x认证对比
- 使用sql server CLR项目生成的存储过程不返回值问题
- 使用Matrix对bitmap的旋转和镜像水平垂直翻转
- loadView的用法
- DAVINCI DM365-DM368开发攻略——开发环境搭建(DVSDK4.02
- 使用J2SE API读取Properties文件的六种方法
- android动画实现-Tween animation(三)
- 2016年中国Wi-Fi家庭用户将达1.1亿
- JSP乱码解决大全(一)
- CloudFoundry中vmc命令使用简单说明
- ASP.net有这些知识,DataSet,DataTable,DataReader,DataAdapter
- 预产渐近