我想测试viewDidLoad和loadView之间的区别,所以我创建了一个单独的视图应用程序,而不是将didFinishLaunchingWithOptions设置为流程:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
viewController = [[MyViewController alloc] init];
// viewController.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
return YES;
}
在我的MyViewController中,m文件为flow:
#import "MyViewController.h"
@interface MyViewController ()
@end
@implementation MyViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",self.view);
self.view.backgroundColor = [UIColor redColor];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)loadView {
self.view = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
}
@end
但是没有调用loadView方法或viewDidLoad。为什么?但是当我在didFinishLaunchingWithOptions上取消注释时,他们都会被调用。
答案 0 :(得分:1)
为什么不调用viewDidLoad?
发生此行为是因为您的窗口是零。因此,您的控制器未显示,并且未加载其视图。
试试这个:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
ViewController *viewController = [[ViewController alloc] init];
// viewController.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
如果取消注释此行
viewController.view.backgroundColor = [UIColor redColor];
,为什么要调用viewDidLoad?
UIViewController
的视图是延迟加载。如果您在didFinishLaunchingWithOptions
取消注释,虽然您的控制器尚未显示,但您已访问其view
属性,则视图将被加载然后将被丢弃。
答案 1 :(得分:1)
我刚用简单的例子检查过:
@implementation TestViewController
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"test");
}
- (void)loadView
{
NSLog(@"load");
}
@end
它运作良好:
2015-08-16 13:18:46.163 Example[51603:406197] load
2015-08-16 13:18:46.164 Example[51603:406197] test
2015-08-16 13:18:46.164 Example[51603:406197] load
2015-08-16 13:18:46.164 Example[51603:406197] test
这是代表:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window.rootViewController = [TestViewController new];
[self.window makeKeyAndVisible];
return YES;
}
更新#1
我忘记了我的默认故事板。我不使用它,但在委托中window
属性初始化需要它:
如果您的应用的Info.plist需要实现此属性 file包含UIMainStoryboardFile键。幸运的是,Xcode 项目模板通常包括合成的声明 应用程序委托自动属性。默认值 合成属性为nil,这会导致app创建泛型 UIWindow对象并将其分配给属性。如果你想提供 您的应用程序的自定义窗口,您必须实现的getter方法 此属性并使用它来创建和返回自定义窗口。