iOS ViewController

写UIKit的代码, ViewController是离不开的.

本文试图讲讲它的基本知识, 不是很深入且有点杂乱, 供初级选手和跨技术栈同学参考.

What is a View Controller

iOS中的View Controller非常像Android中的Activity.

它负责用户界面的展示, 有一些生命周期的回调函数, 还和界面切换有关, 一个app中可以有一个或多个ViewController.

每一个ViewController都有一个single root view, 包含此ViewController的所有内容, 在页面上的所有View都会被加入到以这个root view为根的树形结构中去.

ViewController有一个view属性, 代表最后返回的页面.

ViewController拥有所有的View, 管理和这些View相关的交互, 是离用户最近的第一层代码.

如何定义ViewController.

一般要继承UIViewController.

如果你的页面主要是tableview或者collectionview也可以继承UITableViewController

UICollectionViewController.

ViewController的类型

ViewController的类型有两种:

  • Content view controller: 管理一块view的内容. (大多数的ViewController都是这一种.)
  • Container view controller: 作为一个container, 管理其中的child view controllers.

    把每个child view controller的root view显示在container的view范围内. 可以每次只展示一个child, 也可以多个同时展示. UIKit中的UINavigationController, UITabBarController, UISplitViewController, UIPageViewController都是这种类型, 它们多数是为了不同界面之间的导航服务的.

生命周期回调

Controller的回调中最常用的是:

  • loadView(): 用来设置根view属性, add views等.
  • viewDidLoad(), 可以用来做一些初始化的工作, 比如加载数据, add和remove views, 设置constraints等.

其他的回调方法名字也非常直白:

  • viewWillAppear(): view绘制之前.
  • viewDidAppear(): view绘制出来了.
  • viewWillDisappear(): view马上要消失了.
  • viewDidDisappear(): 已经消失了.

ViewController的职责

ViewController即MVC(Model View Controller)模式中的Controller.

如何管理View和数据的分离和交互是开发者自己的职责.

在简单的demo里, 如果你愿意, 一个ViewController就可以写完所有代码.

和Android一样, 我们会尽量把逻辑从ViewController(Activity)中拆分出去, 写出更加职责分明并且容易被测试的代码.

会有一些流行的模式, 比如MVVM什么的, 这里不展开讲了.

Scene, Window, ViewController

每一个Window都有一个root view controller, 是window最开始的内容.

展示一个新的view controller将会改变窗口内容.

它们之间的关系如图:

图片来源

总结

iOS中的View Controller作为MVC模式中的Controller, 可以类比Android中的Activity:

  • view属性返回页面内容.
  • 有一些生命周期回调.
  • 有一些各种各样的pattern为了让它承担的职责尽量得少.

(其实后端代码提供API的第一层也叫Controller, 所以有没有可能, 最开始设计UIKit的人是一个之前写后端的?)

References

[Android开发学iOS系列] ViewController的更多相关文章

  1. [Android开发学iOS系列] iOS写UI的几种方式

    [Android开发学iOS系列] iOS写UI的几种方式 作为一个现代化的平台, iOS的发展也经历了好几个时代. 本文讲讲iOS写UI的几种主要方式和各自的特点. iOS写UI的方式 在iOS中写 ...

  2. [Android开发学iOS系列] 工具篇: Xcode使用和快捷键

    [Android开发学iOS系列] 工具篇: Xcode使用和快捷键 工欲善其事必先利其器. 编辑 Cmd + N: 新建文件 Option + Cmd + N: 新建文件夹 Cmd + / : 注释 ...

  3. [Android开发学iOS系列] Auto Layout

    [Android开发学iOS系列] Auto Layout 内容: 介绍什么是Auto Layout. 基本使用方法 在代码中写约束的方法 Auto Layout的原理 尺寸和优先级 Auto Lay ...

  4. [Android开发学iOS系列] 语言篇: Swift vs Kotlin

    Swift vs Kotlin 这篇文章是想着帮助Android开发快速学习Swift编程语言用的. (因为这个文章的作者立场就是这样.) 我不想写一个非常长, 非常详尽的文章, 只是想写一个快速的版 ...

  5. [Android开发学iOS系列] 快速上手UIKit

    快速上手iOS UIKit UIKit是苹果官方的framework, 其中包含了各种UI组件, window和view, 事件处理, 交互, 动画, 资源管理等基础设施支持. 按照前面的介绍, 用U ...

  6. Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...

  7. android开发学习笔记系列(1)-android起航

    前言 在学习安卓的过程中,我觉得非常有必要将自己所学的东西进行整理,因为每每当我知道我应该是如何去实现功能的时候,有许多细节问题我总是会遗漏,因此我也萌生了写一系列博客来描述自己学习的路线,让我的an ...

  8. android开发学习笔记系列(2)-android应用界面编程

    前言 本篇博客将会简要介绍andriod开发过程中的一些界面元素和编程的实现,我将大家走进安卓的XML世界,当然可能会涉及到java代码,当然本文主要是介绍XML文件的界面布局. 那么我们的XML存在 ...

  9. android开发学习笔记系列(4)--android动态布局

    前言 在做一个有关苏果APP的项目中,但是fuck的是,我完全使用相对布局之后及线性布局之后发现坑爹的事情了,屏幕不能适配,这是多大的痛,意味着,必须使用相应的代码实现动态布局!呵呵,不做项目不知道, ...

随机推荐

  1. mosquitto使用的基本流程以及一些遇见的问题

    改配置文件 以记事本的方式打开mosquitto.conf更改部分内容,找到# listener port-number [ip address/host name/unix socket path] ...

  2. Luogu2798 爆弹虐场 (二分,Kruskal)

    二分答案,判定连通性 #include <iostream> #include <cstdio> #include <cstring> #include <a ...

  3. Docker 12 数据卷

    参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...

  4. [题解]Balance

    1.题目 POJ-1837 2.题目大意 一个天平上有一些钩子,现在有一些砝码.给出每个钩子到原点(姑且这么叫吧)的距离(-15 ~ 15,负数代表在左边,正数相反)以及砝码的重量(1 ~ 20),求 ...

  5. 操作系统学习笔记4 | CPU管理 && 多进程图像

    操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件.而通过学习笔记3的简史回顾,操作系统通过多进程图像实现对CPU的管理.所以多进程图像是操作系统的核心图像. 参考资料: 课程:哈 ...

  6. i40e网卡驱动遇到的一个问题

    最近在排查一个crash文件的时候,遇到一个堆栈,即软中断收包的时候,skb的关联的dev是null,导致oops, 然后去crash分析的时候,发现skb的dev去不是null. 从oops到cra ...

  7. rh358 001 Linux网络与systemd设置

    358 rhel7 ce ansible 部署服务 dhcp nginx vanish haproxy 打印机服务 服务管理自动化 systemd与systemctl systemctl 来管理sys ...

  8. 【java】学习路径40-Buffer缓冲区输入流

    @Testpublic void testBufferInputStream(){ BufferedInputStream bfis = null; try { bfis = new Buffered ...

  9. k8s命令补全方法

    正常安装了k8s后,使用kubect 工具后接的命令不能直接tab补全 命令补全方法: yum -y install bash-completionsource /usr/share/bash-com ...

  10. 一款类似B站的开源弹幕播放器,太酷了

    今天小编推荐一款开源的弹幕视频播放器,由Typescript加Sass编写,无任何第三方运行时依赖,Gzip大小只有21KB,兼容IE11,支持SSR,支持直播.该播放器高度可定制,所有图标.按钮.色 ...