UIWindow
一、UIWindow的介绍
UIWindow是一个特殊的UIView通常在一个app中只有一个UIWindow
iOS程序启动的完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
也就是说,没有UIWindow就没看不见任何UI界面,因为只有UIWindow才具有显示的在的方法
makeKeyAndVisible
二、视图控制器的显示
AppDelegate中的 didFinishLaunchingWithOptions
我们创建我们创建空项目的时候,AppDelegate 的 * - ( BOOL )application:(UIApplication *) didFinishLaunchingWithOptions:(NSDictionary *) * 方法,主要做三个步骤:
创建UIWindow
设置UIWindow的背景色
让UIWindow显示出来(成为主窗口,并且实现出来)
在第二个步骤中我们可以添加控制器,添加控制器的时候推荐使用
self.window.rootViewController = vc;
* - ( BOOL )application:(UIApplication *) didFinishLaunchingWithOptions:(NSDictionary *) * 方法 如下
// 1.创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 2.设置UIWindow的背景颜色
self.window.backgroundColor = [UIColor redColor];
// 创建控制器
// WMViewController *vc = [[WMViewController alloc] init];
// 将控制器的view添加到UIWindow上
// 问题1:当view发生一些事件的时候,通知控制器, 但是控制器以及销毁了,所以可能出现未知错误
/*
问题2:当发生旋转事件的时候 UIApplication对象会将旋转事件传递给UIWindow
UIWindow又会将旋转事件传递它的根控制器,由根控制器决定是否需要旋转
UIApplication->UIWindow->根控制器
*/
// [self.window addSubview:vc.view];
// 设置UIWindow的根控制器(建议使用下面这种方式)
// self.window.rootViewController = vc;
// UISwitch *switchBtn = [[UISwitch alloc] init];
// [self.window addSubview:switchBtn];
// 3.让UIWindow显示出来(让窗口成为主窗口 并且显示出来)
// 一个应用程序只能有一个主窗口
[self.window makeKeyAndVisible];
// 让UIWindow成为主窗口
// [self.window makeKeyWindow];
三、多个UIWindow的情况
一般一个app中,只有一个UIWindow,但是也可以有多个UIWindow,添加多个的时候,后面添加的一个成为主窗口。
多个窗口的情况下,ios7以前非主窗口能把键盘弹出来,但是不能获取到键盘的输入,ios7及其以后,都能。
// 程序启动完毕之后就会调用一次
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 1.创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 设置UIWindow的背景颜色
self.window.backgroundColor = [UIColor redColor];
// 让UIWindow显示出来(让窗口成为主窗口 并且显示出来)
// 一个应用程序只能有一个主窗口
[self.window makeKeyAndVisible];
// 让UIWindow成为主窗口
// [self.window makeKeyWindow];
// 2. 再创建一个窗口
UIWindow *w2 = [[UIWindow alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
w2.backgroundColor = [UIColor yellowColor];
[w2 makeKeyAndVisible];
self.w2 = w2;
// 3.创建两个文本输入框
// 3.1将文本输入框添加到window中
UITextField *tx1 = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 200, 40)];
tx1.borderStyle = UITextBorderStyleRoundedRect;
[self.window addSubview:tx1];
// 3.2将文本输入框添加到w2中
UITextField *tx2 = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 100, 40)];
tx2.borderStyle = UITextBorderStyleRoundedRect;
[self.w2 addSubview:tx2];
// 获取应用程序的主窗口
NSLog(@"%@", [UIApplication sharedApplication].keyWindow);
return YES;
}
四、创建的时候有Storyboard的情况
上面的步骤完成,那么也就有UIWindow对象了。
五、UIWindow的获得
n[UIApplication sharedApplication].windows
在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
(平时输入文字弹出的键盘,就处在一个新的UIWindow中)
n[UIApplication sharedApplication].keyWindow
用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow
nview.window
获得某个UIView所在的UIWindow