viewDidLoad和loadView问题

时间:2015-08-16 10:07:06

标签: ios

我想测试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上取消注释时,他们都会被调用。

2 个答案:

答案 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方法   此属性并使用它来创建和返回自定义窗口。