我想测试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文件中是as flows:
#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不是called.Why吗?但是,当我在didFinishLaunchingWithOptions .they取消注释时,所有的注释都会被调用。
发布于 2015-08-16 18:19:40
为什么不调用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属性,那么视图将被加载,然后将被丢弃。
发布于 2015-08-16 18:20:38
我只是用一个简单的例子进行了验证:
@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文件包含UIMainStoryboardFile密钥,则此属性的
实现是必需的。幸运的是,Xcode项目模板通常包括自动为应用程序委托的属性的合成声明。此合成属性的默认值为nil,这会导致应用程序创建一个通用UIWindow对象并将其分配给该属性。如果要为应用程序提供自定义窗口,则必须实现此属性的getter方法,并使用它创建和返回自定义窗口。
发布于 2015-08-16 18:26:37
"loadView“是在调用self.view时调用的,并且self.view为空,因此如果您取消注释
viewController.view.backgroundColor = [UIColor redColor];你从字面上调用self.view,它会(在内部)调用"loadView“,然后调用"viewDidLoad”。
我猜是因为"self.window“没有初始化,"loadView”和"viewDidLoad“没有被调用。
https://stackoverflow.com/questions/32033908
复制相似问题