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不会起到这个效果)

  • 相关阅读:
    SQL2005 SQL2008 远程连接配置方法
    Subvision 安装 部署 TortoiseSVN
    在wpf或winform关闭子窗口或对子窗口进行某个操作后刷新父窗口
    C# 中的委托和事件
    长数字隔三位用逗号","隔开,保留两位小数,指定长度,不足补空格
    C# 柱状图, 折线图, 扇形图
    如何在Visual Studio 2010旗舰版本下安装Window Phone 7 简体中文开发环境
    vs2010发布、打包安装程序(超全超详细)
    java 环境搭建
    SQL2008 转 2000(高版本转换到低版本)
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/5741208.html
Copyright © 2011-2022 走看看