2015-08-16 58 views
0

我想测试viewDidLoad中和的loadView之间的区别,所以我创建一个单一视图的应用程序和超过设定的didFinishLaunchingWithOptions如流:viewDidLoad中和的loadView问题

- (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档是流动:

#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取消注释时,他们都被调用。

回答

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财产,那么该观点被加载,然后将被丢弃。

+0

它工作,我也找到它了。谢谢你的回答。 – Scott

+0

我可以说,当我们使用self.view,如果视图为零,方法loadView会调用? – Scott

+0

你说得对。 'viewDidLoad'将在'loadView'之后执行。 – Bannings

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

我忘了关于默认storyboa我有。我不使用它,但它是在代表要求window属性初始化:如果您的应用程序的Info.plist 文件包含UIMainStoryboardFile关键

这个属性的实现是必需的。幸运的是,Xcode的 项目模板通常包括 属性的应用程序委托合成宣言自动。此 合成属性的默认值是零,这将导致该应用创建的通用 一个UIWindow对象,并将其分配给属性。如果您想为您的应用程序提供 自定义窗口,你必须实现的 此属性的getter方法,并用它来创建并返回您的自定义窗口。

+0

你可以尝试:删除故事板或笔尖,然后运行它 – Scott

+0

我认为很简单的解决方案将是有默认的故事板。我不使用IB作为用户界面,但这使事情变得简单。 –

+0

问题的关键是窗口不会是零,并且'UIViewController'的'view'属性是延迟加载。 – Bannings

1

“的loadView” 当self.view被调用,self.view是零被调用,因此,如果您取消注释

viewController.view.backgroundColor = [UIColor redColor]; 

你从字面上叫自我。视图,它会调用(内部)“loadView”,然后“viewDidLoad”。

我想这是因为“self.window”未初始化,“loadView”和“viewDidLoad”未被调用。

+0

这是正确的,谢谢了很多。 – Scott