师傅发我一堆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里面详细讲述了这几个函数;