
转载自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的用法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)