UIViewController的loadView需要了解和注意的问题
2011-06-05 02:25
381 查看
UIViewController的loadView
用UIViewController有一段时间了,才发现以前对loadView的理解完全不到位。
假如我们用Xcode新建一个View-based Application,在ViewController.m中加上
再增加viewDidLoad,按照一般的情况,我们会有这样的Code (viewDidLoad loadView 不要共存 NOTE by JHorn)
现在打开MainWindow.xib,删掉其中的ViewController,并在AppDelegate.m的
里增加ViewController的初始化
编译运行就有问题了。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。
用UIViewController有一段时间了,才发现以前对loadView的理解完全不到位。
假如我们用Xcode新建一个View-based Application,在ViewController.m中加上
- (void) loadView { NSLog(@"loadView Called"); }
再增加viewDidLoad,按照一般的情况,我们会有这样的Code (viewDidLoad loadView 不要共存 NOTE by JHorn)
- (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。
相关文章推荐
- 使用SendKeys 类的需要注意的问题
- matlab需要注意的小问题
- C#中ref和out参数使用时需要注意的问题
- Android 应用程序升级到 5.0 需要注意的问题
- 工作需要了解的方法论-问题分析与解决
- SQL需要注意的一些问题
- 使用SQLite附加(ATTACH)数据库时,需要注意数据文件编码的问题
- 文件上传实际中需要注意的问题
- 在windows开发环境中,java代码中使用linux格式路径的方法需要注意的问题
- SQL2000数据库在安装时候需要注意的问题
- Android Studio中进行ActionBar开发需要注意问题
- Magento系统迁移时需要注意的问题
- Cocos2d-x 3.0 Android修改APK名、更改图标、修改屏幕方向、修改版本号,一些需要注意的问题
- C#操作Word需要注意的一些问题
- 迁移SharePoint Portal Server 2003 (sps2003) 需要注意和出现的问题
- C++程序员需要注意的11个问题
- 网站更换域名需要注意的一些问题
- VS2010使用Visual.Assist.X破解补丁需要注意的问题
- NPOI导出Excel2007-xlsx格式文件,用于web时需要注意的问题-XSSFWorkbook处理问题
- 使用接插件需要注意的问题