zoukankan      html  css  js  c++  java
  • iOS中的UIWindow

    UIWindow的作用

    UIWindow主要有两个作用:

    1 作为UIView视图的最顶层容器,包含所有要显示的UIView

    2 传递触摸,非触摸,键盘事件,其中传递非触摸和键盘事件时,UIWindow必须是keyWindow(经过实验,传递触摸事件时不需要UIWindow是keyWindow,但是必须可见)

    创建UIWindow

    创建UIView的时候,需要使用addSubview将新创建的View添加到视图层次当中,而创建UIWindow的时候不用这样做,因为UIWindow就是视图的最顶层容器,只要直接设置其hidden = NO,或者调用makeKeyAndVisible就可以显示了。新创建的window都会被加入到UIApplication的windows属性中,windows是一个数组,整个数组整体上按照windowLevel由低到高排序,即第0个window的windowLevel肯定最低,最后一个window的windowLevel最高,如果有两个window的windowLevel相同,那么它们的顺序是不确定的(此时,不一定就是按照创建的先后顺序排)

    UIWindow的rootViewController属性

    1 在为UIWindow添加子视图的时候,除了使用addSubview添加,还可以设置window的rootViewController属性。设置rootViewController之后,rootViewController上的view自动被加入到window当中,并且如果设置rootViewController时window原来就有子视图,那么这些子视图会先被移除掉。

    2 如果你在(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法返回之前创建了一个window,那么就必须为其设置rootViewController属性,否则会报"Application windows are expected to have a root view controller at the end of application launch"的错误。

    特别的,如果你在(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中创建了一个window1并且设置了rootViewController1,然后在这个rootViewController1的viewDidLoad中又创建了一个window2,但是没有为其设置rootViewController属性,程序运行的时候就会报上述错误,原因就是调用rootViewController1的viewDidLoad的时候,(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法还没有返回。

    实际上,不管是把创建window2的代码加到rootViewController1的loadView还是viewWillAppear中都会出现这个问题,因为(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions在viewWillAppear调用之后才会继续运行。解决上面问题方法就是可以把创建window2的代码放在viewDidAppear中,此时- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法已经运行结束了。

    UIWindow的windowLevel

    windowLevel越大,在视觉上window就越靠前,低windowLevel的window不会遮挡高windowLevel的window。如果两个window的windowLevel一样,那么它们的顺序不确定(并不一定按照创建的先后顺序),如果想要把同一级的某个window放到和它同级window的最前面,调用makeKeyAndVisible即可(调用makeKeyWindow不会起到这个效果)

  • 相关阅读:
    31 把数组排成最小的数 + 仿函数的写法就记忆这个就行了
    30 整数中1出现的次数(从1到n整数中1出现的次数)这题很难要多看*
    29 连续子数组的最大和
    c/c++ struct的大小以及sizeof用法
    28 最小的K个数
    27 数组中出现次数超过一半的数字
    26 字符串的排列
    Python 实例2—购物车
    python_threading模块实现多线程详解(转)
    Ubuntu 16.04 安装Postman
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/5741208.html
Copyright © 2011-2022 走看看