• 【程序启动四大对象


    A.UIWindow概念
    1.继承UIView,是一种特殊的UIView
    2.通常一个APP只有一个UIWindow
    3.iOS程序启动后,创建的第一个视图就是UIWindow
    4.没有UIWindow,不能显示任何东西
     
    Image(187)
     
    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.创建一个控制器
    Image(188)
     
    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,不能处理各种相关事件(例如屏幕旋转)
    Image(189)
     
    (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 }
     
    Image(190)
     
     
    4.界面切换
    其实是不同的控制器替换到UIWindow上面
    改变self.window.rootViewController
     
     
    C.app四大对象的关系
    Image(191)
     
    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是主窗口
    复制代码
     
    Image(192)
     
    2.屏幕上的所有窗口
    [UIApplication sharedApplication].windows
    在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
    (平时输入文字弹出的键盘,就处在一个新的UIWindow中)
     
    [UIApplication sharedApplication].keyWindow
    用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow
     
    view.window
    获得某个UIView所在的UIWindow
     
    3.TextField呼出的键盘是一个独立的window
  • 相关阅读:
    罗尔定理、微分中值定理、广义微分中值定理
    高等数学和数学分析教材推荐及其学习方法浅谈
    音视频下载插件 安装及使用
    win10台式机rtl8188eu(FW 150 UM V2.0)无线网卡无法连接wifi(无法连接到这个网络)
    django模板中的extends和include使用方法
    wordpress中文目录出现“有点尴尬诶!该页无法显示"
    wordpress迁移后登陆时出现Forbidden You don’t have permission to access /wp-login.php on this server
    centos设置开机自启动脚本
    hexo的jacman主题设置语言为英文后偶尔出现中文
    安卓QQ聊天记录导出、备份完全攻略
  • 原文地址:https://www.cnblogs.com/kengsir/p/4269321.html
Copyright © 2020-2023  润新知