UIWindow

UIWindow

The backdrop for your app’s user interface and the object that dispatches events to your views.

UIWindow是应用用户界面的背景和调度事件反馈到视图的对象。

声明

@interface UIWindow: window

概述

在这里插入图片描述

Windows与视图控制器配合使用来处理事件和完成其他操作,这些操作是应用程序的基础。

仅在需要执行以下操作时才使用Windows:

  • 提供一个主窗口来显示您的应用程序的内容。
  • 创建其他窗口(根据需要)以显示其他内容。

通常,Xcode为你提供你的app主窗口,现在iOS工程使用storyboard来定义app的视图。storyboard需要应用程序代理对象上提供window的属性,Xcode的模板会自动提供。如果你的应用不需要使用stroyboard,你需要自己创建应用程序窗口。iOS13移除stroyborad

// oc
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end
// swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
}

了解关键窗口交互

尽管触摸事件被传递到发生它们的窗口,但是没有相关坐标值的事件被传递到按键窗口。 一次只能将一个窗口用作key窗口,并且可以使用窗口的isKeyWindow属性来确定其状态。 在大多数情况下,您应用的主窗口是关键窗口,但是UIKit可以根据需要指定其他窗口。

使用

UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow。iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了。一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow。也就说,没有UIWindow,就看不见任何UI界面。

UIWindow2种创建方式

storyboard

为什么创建一个storyboard,没有看到创建UIWindow的过程?

它其实是把创建UIWindow的过程给屏蔽起来了。可以把代理的UIWindow的属性的值打印出来NSLog(@“window=%p”,self.window);打印出来确实是有值的,说明确实创建了UIWindow.不仅创建了UIWindow,默认还创建了UIWindow对应的控制器,也可以打印进行查看。NSLog(@“%@“,self.window.rootviewcontroller);

有storyboard的项目中的创建过程:

当用户点击应用程序图标的时候,先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application,创建代理,并且把代理设置给application(看项目配置文件info.plist里面的storyboard的name,根据这个name找到对应的storyboard),开启一个事件循环,当程序加载完毕,他会调用代理的didFinishLaunchingWithOptions:方法。在调用didFinishLaunchingWithOptions:方法之前,会加载storyboard,在加载的时候创建一个window,接下来会创建箭头所指向的控制器,把该控制器设置为UIWindow的根控制器,接下来再将window显示出来,即看到了运行后显示的界面。

纯代码创建

参考文章:纯代码创建UIWindow

贴出主要代码,完成window的初始化,设置window的根视图控制器,将window设为主窗口并显示。

#import "AppDelegate.h"
#import "ViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [[ViewController alloc] init];
    [self.window makeKeyAndVisible];
    return YES;
}


@end

UI框架

基于TabBarController + NavigationController方案
在这里插入图片描述
现在主流的框架方案:NavigationController + TabBarController
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值