应用程序的控制器

来源:互联网 发布:linux mkfifo 编辑:程序博客网 时间:2024/06/04 18:22

应用程序启动原理


- (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 中, 是一种特殊类型的对象
  • 对象的具体实例

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


0 0