ios view的创建过程

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

ios view的创建过程

时间: 2024-12-28 17:02:35

ios view的创建过程的相关文章

ios中View的创建过程

ios应用中控制器view的创建方式有三种:storyboard.xib和代码,当APP启动后View的具体加载过程如图(苹果官方): 假设我使用的是WYSViewController控制器 应用启动时会加载控制器的loadView, 1.如果loadView中有代码,直接用loadView中的代码来创建View 2.如果loadView中没有代码, A.当你使用了storyboard时,程序加载storyboard来创建View, B.当你使用了xib时,程序就加载xib来创建View, a.

【iOS开发-73】创建控制器的3种方式、深入了解view的创建和加载顺序

(1)创建控制器的3种方式 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; [self.window makeKeyAndVisible]; //关于主窗口 //在iOS6之前,

创建控制器的3种方式、深入了解view的创建和加载顺序

转载自:http://blog.csdn.net/weisubao/article/details/41012243 (1)创建控制器的3种方式 [objc] view plaincopy - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window=[[UIWindow alloc]initWithFrame:[

Android应用程序窗口View的measure过程

Android应用程序的界面是View组成的,这些View以树形结构组织,它们存在着父子关系,其中,子view位于父view里面,因此,在绘制一个Android应用程序窗口的View之前,我们首先要确定它里面的各个子view在父view里面的大小以及位置.确定各个子view在父view里面的大小以及位置的过程又称为测量过程和布局过程.测量和布局完后,就可以绘制view了. 参考上一篇文章Android应用程序窗口View的创建过程,可以知道Android应用程序窗口的根View是DecorVie

IOS UI-控制器的创建和控制器的View的创建

一.控制器的创建和控制器的View的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中创建一个控制器. 1 #import "YYAppDelegate.h" 2 #import "YYViewController.h" 3 4 @implementation YYAppDelegate 5 6 - (BOOL)application:(UIA

一、iOS控制器view的创建方式(官方文档翻译)

1.loadView方法官方说明如下: You should never call this method directly. The view controller calls this method when its view property is requested but is currently nil. This method loads or creates a view and assigns it to the view property. 你不应该直接调用这个方法,当需要访

iOS学习4_控制器的创建方式和控制器view的创建

UIScreen是与设备有关的物理屏幕 Window是一个窗口对应UIWindow类,继承自UIView,window要显示在Screen上必须设置为主窗口并且可见.接下来就可以往UIWindow上面添加一些控件了. 下图就是简单地层次关系 ViewController是用来组织和控制视图的,与上图不同的是这里使用了视图控制器ViewController,不需要直接将view指定给window,相反,只需要给window制定一个视图控制器,视图控制器会自动的将他的view添加给window.如下

iOS开发UI篇—控制器的View的创建

iOS开发UI篇—控制器的View的创建 一.6种创建控制器View的方式 1 #import "NJAppDelegate.h" 2 #import "NJViewController.h" 3 /* 4 1.没有同名xib情况下 5 2.通过 storyboard 创建 6 3.有指定xib情况下创建 7 4.有同名xib情况 8 5.有同名去掉controll的情况 9 6.loadveiw 10 */ 11 @implementation NJAppDele

[ IOS ] iOS-控制器View的创建和生命周期

reference to  : 1. 控制器View的创建 首先我们来看一下控制器view创建的流程图 控制器view加载.jpeg 从图中我们可以看出,在控制器view加载过程中有两个重要的方法loadView和viewDidLoad.下面我们来重点了解一下这两个方法. loadView方法 作用:loadView方法是用来负责创建UIViewController的view.首先判断下有没有指定storyboard或者xib,如果指定,就会加载它们描述的控制器的view,如果没有指定,创建一个