iOS学习笔记-045.UIWindow

UIWindow

一、UIWindow的介绍

UIWindow是一个特殊的UIView通常在一个app中只有一个UIWindow

iOS程序启动的完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了

也就是说,没有UIWindow就没看不见任何UI界面,因为只有UIWindow才具有显示的在的方法

makeKeyAndVisible

二、视图控制器的显示

AppDelegate中的 didFinishLaunchingWithOptions

我们创建我们创建空项目的时候,AppDelegate 的 * - ( BOOL )application:(UIApplication *) didFinishLaunchingWithOptions:(NSDictionary *) * 方法,主要做三个步骤:

  1. 创建UIWindow

  2. 设置UIWindow的背景色

  3. 让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

六、几个对象关系图

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值