【程序启动四大对象】UIWindow

A.UIWindow概念

1.继承UIView,是一种特殊的UIView

2.通常一个APP只有一个UIWindow

3.iOS程序启动后,创建的第一个视图就是UIWindow

4.没有UIWindow,不能显示任何东西

B.使用

1.创建一个Empty Application项目

没有了storyboard,要手动实现UIWindow的创建代码(其实这就是storyboard做的事情)

1     // 手动创建UIWindow,并加到screen上
2     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
3     self.window.backgroundColor = [UIColor whiteColor];
4     [self.window makeKeyAndVisible];

2.创建一个控制器

3.把控制器的view添加到UIWindow

添加UIView到UIWindow中两种常见方式:
- (void)addSubview:(UIView *)view;
直接将view添加到UIWindow中,但并不会理会view对应的UIViewController

@property(nonatomic,retain) UIViewController *rootViewController;
自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期

常用方法
- (void)makeKeyWindow;
让当前UIWindow变成keyWindow(主窗口)

- (void)makeKeyAndVisible;

让当前UIWindow变成keyWindow,并显示出来

(1)直接添加控制器的view到UIWindow

1     // 添加控制器
2     ViewController *controller = [[ViewController alloc] init];
3     [self.window addSubview:controller.view];

不建议此方法,因为

a.可能自定义控制器变量被销毁之后,其view还在UIWindow中被使用,如果再使用控制器会引起崩溃

b.由于没有传自定义控制器给UIWindow,不能处理各种相关事件(例如屏幕旋转)

(2)设置自定义控制器为UIWindow的rootViewController

设置了根控制器之后,会自动把自定义控制器的view加到UIWindow

1     // 添加控制器
2     ViewController *controller = [[ViewController alloc] init];
3 //    [self.window addSubview:controller.view];
4     self.window.rootViewController = controller;

(3)在controller中设置状态栏可视

1 - (BOOL)prefersStatusBarHidden {
2     return NO;
3 }

4.界面切换

其实是不同的控制器替换到UIWindow上面

改变self.window.rootViewController

C.app四大对象的关系

D.UIWindow的其他概念

1.主窗口

a.获得主窗口 [UIApplication sharedWindow].keyWindow

b.可以通过makeKeyWindow设置主窗口,makeKeyAndVisible来设置主窗口兼可视

c.一个屏幕只能有一个主窗口,使用最后更新(最后使用makeKeyWindow或者makeKeyAndVisible)的UIWindow为主窗口

    d.iOS7之前只有主窗口能够处理TextField输入事件,之后全部窗口都能处理

1     // 手动创建UIWindow,并加到screen上
2     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
3     self.window.backgroundColor = [UIColor grayColor];
4     [self.window makeKeyAndVisible]; // 此刻window是主窗口
5
6     // 手动在.h文件中定义了一个window2,不能使用临时变量,否则会被回收
7     self.window2 = [[UIWindow alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];;
8     self.window2.backgroundColor = [UIColor redColor];
9     [self.window2 makeKeyAndVisible]; // 这时候window2是主窗口

2.屏幕上的所有窗口

[UIApplication sharedApplication].windows

在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象

(平时输入文字弹出的键盘,就处在一个新的UIWindow中)

[UIApplication sharedApplication].keyWindow

用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow

view.window
获得某个UIView所在的UIWindow

3.TextField呼出的键盘是一个独立的window

时间: 2024-10-26 03:33:14

【程序启动四大对象】UIWindow的相关文章

【程序启动四大对象】UIApplicationDelegate & 程序启动过程

A.概念 1.移动app非常容易受到其他的系统.软件事件的干扰,如来电.锁屏 2.app受到干扰的时候,UIApplication会通知delegate,来代理处理干扰事件 3.delegate可以处理的事件 (1)app声明周期(启动.关闭) (2)系统事件(来电) (3)紧急事件(内存警告) B.使用 称为delegate的条件:遵守UIApplicationDelegate协议 项目开始会自动创建:AppDelegate 1.delegate方法 1 - (BOOL)application

程序启动原理(四大对象)

程序启动四大对象(UIApplication,AppDelegate) 一.UIApplication 1.什么是UIApplication? •UIApplication对象是应用程序的象征 •每一个应用都有自己的UIApplication对象,而且是单例的 •通过[UIApplication sharedApplication]可以获得这个单例对象 •一个iOS程序启动后创建的第一个对象就是UIApplication对象 •利用UIApplication对象,能进行一些应用级别的操作 2.U

iOS核心笔记——iOS应用程序启动原理

1.iOS应用程序启动示例图: 2.应用程序启动原理: 2-1.不通过storyboard文件启动: 执行main函数: 执行main函数中的UIApplicationMain函数,创建UIApplication对象,创建ApplicationDelegate对象并将其设置为UIApplication对象的代理: 程序启动完毕,开启消息循环(Main RunLoop).监听事件并调用注册方法:接着调用代理的application:didFinishLaunchingWithOptions:方法:

info.plist、pch和四大对象(UIApplication、UIApplicationDelegate、UIWindow、UIViewController)

本文目录 1.程序配置文件info.plist,全局头文件pch 2.应用程序对象UIApplication介绍 3.UIApplicationDelegate介绍,程序启动过程 4.UIWindow对象 5.程序界面显示出来的过程 6.总结程序启动完整过程 -1.程序配置文件info.plist,全局头文件pch 1.程序配置文件info.plist,全局头文件pch 回到顶部 工程的配置中Info选项里面的内容实际上是info.plist文件里面的内容的拷贝,info.plist里面存放了许

41-50(UIApplication和delegate,UIApplicationMain,UIWindow,程序启动的完整过程,控制器view的延迟加载)

41.UIApplication和delegate 42.UIPickerView 43.UIDatePicker 44.程序启动的完整过程 45.UIApplicationMain 46.UIWindow 47.如何创建一个控制器 48.控制器view的延迟加载 49.多控制器 50.UINavigationController的使用步骤 { 这几天一直在赶项目, 今天终于闲下来了! 今天是个好日子,空间里满天的2014520 那么来看看我们程序员的爱情吧! 爱情就是死循环,一旦执行就陷进去了

[iOS基础控件 - 6.10.7] UIWindow & 程序启动过程

A.UIWindow概念 1.继承UIView,是一种特殊的UIView 2.通常一个APP只有一个UIWindow 3.iOS程序启动后,创建的第一个视图就是UIWindow 4.没有UIWindow,不能显示任何东西 B.使用 1.创建一个Empty Application项目 没有了storyboard,要手动实现UIWindow的创建代码(其实这就是storyboard做的事情) 1 // 手动创建UIWindow,并加到screen上 2 self.window = [[UIWindo

该对象尚未初始化。请确保在所有其他初始化代码后面的应用程序启动代码中调用

WebAPI使用属性路由,配置config.MapHttpAttributeRoutes();后出现错误: System.InvalidOperationException: 该对象尚未初始化.请确保在所有其他初始化代码后面的应用程序启动代码中调用 HttpConfiguration.EnsureInitialized(). 在 System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes() 在 System.Web.Http.Routi

excel不能启动此对象的源应用程序

不能启动此对象的源应用程序 案例: 某公司有文员使用CAD2006划图然后将图纸复制粘贴到excel 2007当中,因公司发展需要,把CAD2006升级到CAD2008版本后,excel2007中原先做好的图纸文档打不开,会提示"不能启动此对象的源应用程序",图例: 原因: 这是因为不同版本的AutoCAD使用不同的注册表项来连接OLE对象的服务器程序.当对应版本的软件没有安装时,容器程序便无法找到OLE服务程序. 本例中电脑安装的是AutoCAD2008的版本,而图纸是用AutoCA

Android深入四大组件(一)应用程序启动过程

相关文章 Android系统架构与系统源码目录 Android系统启动流程(一)解析init进程启动过程 Android系统启动流程(二)解析Zygote进程启动过程 Android系统启动流程(三)解析SyetemServer进程启动过程 Android系统启动流程(四)Launcher启动过程与系统启动流程 Android应用程序进程启动过程(前篇) Android应用程序进程启动过程(后篇) 前言 在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺