在程序的启动过程中提到
如果没有
storyboard时:
* 程序启动时候, 就会调用代理的application: didFinishLaunchingWithOptions:方法
* 在application: didFinishLaunchingWithOptions:中创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
也就是说:程序启动,先加载
UIWindow,
UIWindow将作为容器去接收的控件;
那么
UIWindow是什么?
UIwindow是一个特殊的UIView,在一个app
只能有一个
UIWindow
是
keyWindow
;
iOS
程序启动完毕后,创建的第一个视图控件就是
UIWindow
,接着创建
UIViewController的view
,
最后将
UIViewController的view
添加到
UIWindow
上,于是
UIViewController的view
就显示在屏幕上了;
一个
iOS
程序之所以能显示到屏幕上,完全是因为它有
UIWindow。
ps:
UIViewController的属性
@property
(
null_resettable
,
nonatomic
,
strong
)
UIView
*view;
看一张图片:
UIwindow的常见方法:
- (
void
)makeKeyWindow
;
让当前
UIWindow
变成
keyWindow
(主窗口)
- (
void
)makeKeyAndVisible;
让当前
UIWindow
变成
keyWindow
,并显示出来
添加
UIView
到
UIWindow
中
- (
void
)addSubview:(
UIView
*)view;
直接将
view
添加到
UIWindow
中,但并不会理会
view
对应的
UI
ViewController
@property
(
nonatomic
,
retain
)
UIViewController
*
rootViewController
;
自动将
rootViewController
的
view
添加到
UIWindow
中
,负责管理
rootViewController
的生命周期
总结:在没有
storyboard时,首先需要创建
UIWindow,再创建
UIViewController;
UIViewController的创建方式一:代码创建
创建一个类
YSCViewController继承自
ViewController,将头文件(
#import
“YSCViewController.h”
)导入
AppDelegate.m
代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//实例化window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//创建控制器并使之成为root控制器
YSCViewController *vc = [[YSCViewController alloc] init];
self.window.rootViewController = vc;
//设置window为主window和可见
[self.window makeKeyAndVisible];
return YES;
}
UIViewController的创建方式二:Xib方式
1.指定xib的名称:
2.不指定xib的名称时:在Xcode7.1中,默认优先与UIViewController类同名的Xib(即YSCViewController),如果同名的不存在,再去调用去掉Controller的Xib(即 YSCView );
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//实例化window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//创建控制器并使之成为root控制器
YSCViewController *vc = [[YSCViewController alloc] initWithNibName:@"YSCViewController" bundle:nil];
self.window.rootViewController = vc;
//设置window为主window和可见
[self.window makeKeyAndVisible];
return YES;
}
2.不指定xib的名称时:在Xcode7.1中,默认优先与UIViewController类同名的Xib(即YSCViewController),如果同名的不存在,再去调用去掉Controller的Xib(即 YSCView );
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//实例化window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//创建控制器并使之成为root控制器
YSCViewController *vc = [[YSCViewController alloc] init];
self.window.rootViewController = vc;
//设置window为主window和可见
[self.window makeKeyAndVisible];
return YES;
}
用xib创建时的注意点:(如果创建类时,同时创建Xib则无需关注)
把该view连线设为主文件
UIViewController的创建方式三:storyboard方式
创建YSCStoryboard.storyboard,并创建两个UIViewController,并将在storyboard 里面Class 要指向要对应的UIViewController,我使用工程中已经存在的类默认的ViewController
1.通过初始化“初始控制器”(storyboard中箭头所指的控制器)来导入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//实例化window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//导入加载storyboard并使之成为root控制器
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YSCStoryboard" bundle:nil];
ViewController *vc = sb.instantiateInitialViewController;
self.window.rootViewController = vc;
//设置window为主window和可见
[self.window makeKeyAndVisible];
return YES;
}
2. 通过一个标识初始化对应的控制器来导入
//导入加载storyboard并使之成为root控制器
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YSCStoryboard" bundle:nil];
ViewController *vc = [sb instantiateViewControllerWithIdentifier:@"edit"];
self.window.rootViewController = vc;