应用程序的控制器

本文介绍如何使用纯代码实现iOS应用的启动过程,包括创建UIWindow、设置背景颜色、指定根视图控制器等关键步骤,并通过实验演示了视图控制器与视图之间的关系。

应用程序启动原理


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];

    ViewController *vc = [[ViewController alloc] init];
    self.window.rootViewController = vc;

    [self.window makeKeyAndVisible];

    return YES;
}

纯代码创建应用程序

目标

  • 掌握纯代码创建应用程序的过程

纯代码创建 App 的写法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];

    ViewController *vc = [[ViewController alloc] init];
    self.window.rootViewController = vc;

    [self.window makeKeyAndVisible];

    return YES;
}


演练

  • 新建项目
  • 删除 Main.storyboard
  • 修改应用程序入口,删除 Main.storyboard


运行程序

不报错,但是黑乎乎一片

  • AppDelegateapplication:didFinishLaunchingWithOptions: 方法中增加断点
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 断点位置
    return YES;
}

po self.window 当不通过 故事板 启动程序时 self.window 对象不会被创建

  • 在此方法中创建 window 并且指定背景颜色
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 1. 常见 window 对象
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];

    return YES;
}

运行测试,仍然黑乎乎一片

回顾故事板启动过程 —— 让 window 在屏幕可见

  • 修改方法,让窗口可见
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 1. 常见 window 对象
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];

    // 3. 让 window 变成主窗口并且可见
    [self.window makeKeyAndVisible];

    return YES;
}

运行测试,崩溃,提示信息如下:

  • Application windows are expected to have a root view controller at the end of application launch

  • 应用程序窗口,在程序启动完成前,期望有一个根视图控制器

  • 导入头文件
#import "ViewController.h"
  • 设置根控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 1. 常见 window 对象
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];

    // 2. 设置根控制器
    // 1> 创建控制器
    ViewController *vc = [[ViewController alloc] init];
    // 2> 让视图控制器成为根控制器
    self.window.rootViewController = vc;

    // 3. 让 window 变成主窗口并且可见
    [self.window makeKeyAndVisible];

    return YES;
}

注意细节:

  1. 没有设置 vc 的根视图的大小
  2. 设置的是 window 的大小

实验一

  • ViewControllerviewDidLoad 方法中设置根视图背景颜色
- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor orangeColor];
}

运行测试,并且旋转屏幕,会发现视图控制器的大小会自动适应

这是因为设置了 UIWindow 的根控制器之后,在设备方向旋转时,UIWindow 会通知视图控制器调整根视图大小

将模拟器切换到慢速动画可以观察动画效果

实验二

  • 取消 window 的大小设置

    self.window = [[UIWindow alloc] initWithFrame:CGRectZero];
    • 新版本的写法
self.window = [[UIWindow alloc] init];

系统底层会自动调整 window 大小,知道就好,建议仍然使用 [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds] 的写法

视图控制器和视图关系

  • 视图控制器和视图的关系示意图:


  • 关系

    • 每一个视图控制器都有一个根视图(强引用)
    • 根据视图所要显示的内容,可以在根视图上添加若干个小视图,分别负责不同区域的显示

      • 在 IB 中直接拖拽一个子视图到视图中,视图层次关系支持嵌套
      • 在代码中通过 addSubView 方法给视图添加子视图
    • 无论用何种方式添加的子视图,都记录在其父视图的 subviews 数组中

      • NSArray 会对内部对象强引用
  • 为什么要自定义

    • 系统默认提供了很多类供程序员使用
    • 当系统提供的类无法满足程序员需要时,可以定义这个类的子类
    • 在子类中增加自己需要的属性方法
    • 子类继承了父类定义的特性(属性和方法),同时又拥有自己定义的属性方法
  • 使用自定义类的结果

    • 控制器的子类能够按照程序员的需求调度
    • 视图的子类能够按照程序员的需求显示

类和对象

  • 是对对象的抽象

    • 类是抽象的,不占用内存
    • 类是用于创建对象的蓝图
    • 是定义包括在特定类型对象中的方法属性的软件模板
    • 在 OC 中, 是一种特殊类型的对象
  • 对象的具体实例

    • 而对象是具体的,占用存储空间
    • 同一个类的对象,具有相同的方法,具有不同的属性


采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值