师傅发我一堆view的创建函数,目的让我知道view的创建过程。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewWillAppear:(BOOL)animated { } - (void)viewDidAppear:(BOOL)animated { } - (void)loadView { } - (void)layoutSublayersOfLayer:(CALayer *)layer { } - (void)viewWillLayoutSubviews { } - (void)viewDidLoad { }
拿到这函数我也没多想就创建了一个single View application 然后创建一个viewcontroller 就将师傅的函数复制进去,然后在AppDelegeteD.m文件中写
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.rootViewController = [[MyViewController alloc]init]; [self.window makeKeyAndVisible]; // Override point for customization after application launch. return YES; }
然后运行 。。。。。。凉了。。。出现错误了;
启动起来黑屏,然后是报这样一个错误Application windows are expected to have a root view controller at the end of application launch
2014-08-13 15:16:45.924 任务1副本[2629:60b] -[YouVC loadView] 2014-08-13 15:16:45.925 任务1副本[2629:60b] -[YouVC viewDidLoad] 2014-08-13 15:16:45.925 任务1副本[2629:60b] -[YouVC loadView] 2014-08-13 15:16:45.926 任务1副本[2629:60b] -[YouVC viewDidLoad] 2014-08-13 15:16:45.927 任务1副本[2629:60b] -[YouVC loadView] 2014-08-13 15:16:45.927 任务1副本[2629:60b] -[YouVC viewDidLoad] 2014-08-13 15:16:45.928 任务1副本[2629:60b] -[YouVC loadView] 2014-08-13 15:16:45.928 任务1副本[2629:60b] -[YouVC viewDidLoad] 2014-08-13 15:16:45.929 任务1副本[2629:60b] Application windows are expected to have a root view controller at the end of application launch
无解 ,网上搜得所有方案都不对。我把焦点放在了 self.window.rootviewcontroller = ....这句话上了;
我开始想它出错的原因,为什么这些方法调用了好几遍,单步调试发现这些函数不止是在初始化的init时候调用。
我又新建了一个viewcontroller就加了一个背景色,结果能运行,我又试着将师傅给的代码贴上去,结果又出现错误了。
我就开始挨个试是什么出现了问题,最后让我找到了原因出在-(void)loadview这个函数上面;
我又开始查询这个函数,最后从M了个J老师这获得了答案:
原来在每次调用view的时候,如果view为空,则会调用这个函数;他的作用就是来创建一个view,首先加载xib 如果没有xib 则自动创建一个大小320*480 的空白view;
在程序的
-(void)loadview 中加入了[super loadview];后程序能够运行了;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } -(id)init { if(self = [super init]) { self.view.frame=[[UIScreen mainScreen]bounds]; self.view.backgroundColor = [UIColor orangeColor]; } return self; } - (void)loadView { // [super loadView]; NSLog(@"%s",__FUNCTION__); } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"%s",__FUNCTION__); // Do any additional setup after loading the view from its nib. } - (void)viewWillAppear:(BOOL)animated { NSLog(@"%s",__FUNCTION__); } - (void)viewDidAppear:(BOOL)animated { NSLog(@"%s",__FUNCTION__); } - (void)layoutSublayersOfLayer:(CALayer *)layer { NSLog(@"%s",__FUNCTION__); } - (void)viewWillLayoutSubviews { NSLog(@"%s",__FUNCTION__); }
运行结果:
2014-08-13 15:35:54.783 任务1副本[2660:60b] -[YouVC loadView] 2014-08-13 15:35:54.783 任务1副本[2660:60b] -[YouVC viewDidLoad] 2014-08-13 15:35:54.784 任务1副本[2660:60b] -[YouVC viewWillAppear:] 2014-08-13 15:35:54.785 任务1副本[2660:60b] -[YouVC viewWillLayoutSubviews] 2014-08-13 15:35:54.835 任务1副本[2660:60b] -[YouVC viewDidAppear:]
这个就是 创建view的时候,相关view创建函数的运行次序:
M了个J老师的博客 http://www.cnblogs.com/mjios/archive/2013/02/26/2933667.html里面详细讲述了这几个函数;