[Android开发学iOS系列] ViewController
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的更多相关文章
- [Android开发学iOS系列] iOS写UI的几种方式
		
[Android开发学iOS系列] iOS写UI的几种方式 作为一个现代化的平台, iOS的发展也经历了好几个时代. 本文讲讲iOS写UI的几种主要方式和各自的特点. iOS写UI的方式 在iOS中写 ...
 - [Android开发学iOS系列] 工具篇: Xcode使用和快捷键
		
[Android开发学iOS系列] 工具篇: Xcode使用和快捷键 工欲善其事必先利其器. 编辑 Cmd + N: 新建文件 Option + Cmd + N: 新建文件夹 Cmd + / : 注释 ...
 - [Android开发学iOS系列] Auto Layout
		
[Android开发学iOS系列] Auto Layout 内容: 介绍什么是Auto Layout. 基本使用方法 在代码中写约束的方法 Auto Layout的原理 尺寸和优先级 Auto Lay ...
 - [Android开发学iOS系列] 语言篇: Swift vs Kotlin
		
Swift vs Kotlin 这篇文章是想着帮助Android开发快速学习Swift编程语言用的. (因为这个文章的作者立场就是这样.) 我不想写一个非常长, 非常详尽的文章, 只是想写一个快速的版 ...
 - [Android开发学iOS系列] 快速上手UIKit
		
快速上手iOS UIKit UIKit是苹果官方的framework, 其中包含了各种UI组件, window和view, 事件处理, 交互, 动画, 资源管理等基础设施支持. 按照前面的介绍, 用U ...
 - Android开发—智能家居系列】(二):用手机对WIFI模块进行配置
		
在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...
 - android开发学习笔记系列(1)-android起航
		
前言 在学习安卓的过程中,我觉得非常有必要将自己所学的东西进行整理,因为每每当我知道我应该是如何去实现功能的时候,有许多细节问题我总是会遗漏,因此我也萌生了写一系列博客来描述自己学习的路线,让我的an ...
 - android开发学习笔记系列(2)-android应用界面编程
		
前言 本篇博客将会简要介绍andriod开发过程中的一些界面元素和编程的实现,我将大家走进安卓的XML世界,当然可能会涉及到java代码,当然本文主要是介绍XML文件的界面布局. 那么我们的XML存在 ...
 - android开发学习笔记系列(4)--android动态布局
		
前言 在做一个有关苏果APP的项目中,但是fuck的是,我完全使用相对布局之后及线性布局之后发现坑爹的事情了,屏幕不能适配,这是多大的痛,意味着,必须使用相应的代码实现动态布局!呵呵,不做项目不知道, ...
 
随机推荐
- dockerfile操作
			
简介 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 上下文路径 如下是一个简单的基于dockerfile创建镜像的命令,我们注意到启动处理镜像名和 ...
 - Windows快捷安装应用方法(此处以Virtualbox为例)
			
1.执行已下载的virtualbox的安装exe文件,使用pywinauto模拟点击Windows安装的对应控件 1.1.启动exe文件 start *.exe 1.2.使用pywinauto(也适用 ...
 - 【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
			
问题描述 经过前两篇文章,分别使用VM搭建了Kafka服务,创建了Azure Function项目,并且都在本地运行成功. [Azure Developer]在Azure VM (Windows) 中 ...
 - 举重若轻流水行云,前端纯CSS3实现质感非凡的图片Logo鼠标悬停(hover)光泽一闪而过的光影特效
			
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_197 喜欢看电影的朋友肯定会注意到一个有趣的细节,就是电影出品方一定会在片头的Logo环节做一个小特效:暗影流动之间光泽一闪而过, ...
 - Vue3:不常用的Composition API  &&  Fragment、Teleport、Suspense  &&  与Vue2对比的一些变化
			
1 # 一.Vue3不常用的Composition API 2 # 1.shallowReactive与shallowRef 3 .shallowReactive: 只处理对象最外层属性的响应式(浅响 ...
 - EPLAN 中的符号、元件、部件与设备之间的区别
			
符号(Symbol):电气符号是电器设备(Electrical equipment)的一种图形表达,符号存放在符号库中,是广大电气工程师之间的交流语言,用来传递系统控制的设计思维的.将设计思维体现出来 ...
 - 发布Android库至MavenCentral详解
			
Sonatype 账号 MavenCentral 和 Sonatype 的关系 库平台 运营商 管理后台 MavenCentral Sonatype oss.sonatype.org 因此我们要发布L ...
 - 即席查询(Ad Hoc)如何做到又快又稳?
			
数字化与数字生态建设,是当前所有企业成长发展的必经之路.随着"加强新型基础设施建设"第一次被写入政府工作报告,5G.人工智能.工业互联网.智慧城市等新型基建彻底激发了数字的价值. ...
 - Spring 02 控制反转
			
简介 IOC IOC(Inversion of Control),即控制反转. 这不是一项技术,而是一种思想. 其根本就是对象创建的控制权由使用它的对象转变为第三方的容器,即控制权的反转. DI DI ...
 - es5 es6 新增
			
es5的新特性 对于数组和字符串都进行了加强 map 遍历 es6的新特性 数组的增强 find 查找findIndex 查找下标 字符的增强 includes 是否包含 (包含返回true 不包含返 ...