1、概述
uiwindow是一种特殊的uiview,通常在一个app中只会有一个uiwindow。
ios程序启动完毕后,创建的第一个视图控件就是uiwindow,接着创建控制器的view,最后将控制器的view添加到uiwindow上,于是控制器的view就显示在屏幕上了。
一个ios程序之所以能显示到屏幕上,完全是因为它有uiwindow。也就说,没有uiwindow,就看不见任何ui界面。
2、添加uiview到uiwindow中两种常见方式
方式一:
- (void)addsubview:(uiview *)view;
直接将view添加到uiwindow中,但并不会理会view对应的uiviewcontroller
例如:
mjoneviewcontroller *one = [[mjoneviewcontroller alloc] init];
[self.window addsubview:one.view];
方式二(开发中实际使用的方法,首选):
@property(nonatomic,retain) uiviewcontroller *rootviewcontroller;
自动将rootviewcontroller的view添加到uiwindow中,负责管理rootviewcontroller的生命周期
self.window.rootviewcontroller = one;
常用方法:
- (void)makekeywindow;
让当前uiwindow变成keywindow(主窗口)。
- (void)makekeyandvisible;
让当前uiwindow变成keywindow,并显示出来。
3、获得uiwindow
[uiapplication sharedapplication].windows
在本应用中打开的uiwindow列表,这样就可以接触应用中的任何一个uiview对象。
(平时输入文字弹出的键盘,就处在一个新的uiwindow中)
[uiapplication sharedapplication].keywindow
用来接收键盘以及非触摸类的消息事件的uiwindow,而且程序中每个时刻只能有一个uiwindow是keywindow。如果某个uiwindow内部的文本框不能输入文字,可能是因为这个uiwindow不是keywindow。
view.window
获得某个uiview所在的uiwindow。
【备注】一个空项目中,appdelegate类遵守了uiapplicationdelegate协议,之后在相应事件发生时候uiapplication会通知它的delegate对象,比如,当应用启动完毕会uiapplication会通知appdelegate,之后会自动调用appdelegate中的didfinishlaunchingwithoptions,这时直接启动之时一个黑的界面,没有任何东西。要想显示东西,首先要用set方法往里面添加一个uiwindow:
self.window =
[[uiwindow alloc]initwithframe[uiscreen mainscreen].bounds];
添加过还不能显示,因为可能存在多个uiwindow,我们要调用get方法获取刚才设置的uiwindow把它设置为主窗口并且显示出来:
[self.window makekeyandvisible];
之后显示的就是这个uiwindow了,我们之后就可以往这个uiwindow中添加控制器(相当于android中的activity),添加时要添加为根控制器这个控制器才能显示出来:
self.window.rootviewcontroller =
myviewcontroller;