UIView , UIViewController Life Cycle 常见问题

UIView , UIViewController Life Cycle 常见问题

在执行专案的过程中,会一直出现常见的几个问题。生成UI的过程中,由於未生成完成,却先layout。造成layout尚未完成,会是crash。这些种种问题,是因为对UIView 与 UIViewController Life Cycle 观念不够清楚导致的。今天参考了一些大神的文章,重新整理一下思绪。

UIViewController

ViewDidLoad

  1. 只会被呼叫一次,load 好了就会一直在记忆体里面
  2. 常常在此 function 用 model 更新 UI,因为此时所有 outlets 都已经绑定完成
  3. 不应在此做任何 layout view 的动作 (更改 frame/bounds),因为此时的view 还没出现在画面上

viewWillAppear

  1. 会被呼叫不只一次,因为只要有返回到该画面的可能性,该 controller 就会有不只一次「准备要显示」的机会
  2. 可以在这边做一些比较耗资源的操作,因为此时画面已经确定将会显示了
  3. 可以在这边做一些 layout view 的操作,因为 view 已经出现在画面上了

viewDidAppear, viewWillDisappear

字面上的意思,周期的一部分
大部分 view 的 layout 会交由 autolayout 来处理,但是也有需要手动改变 view layout 方式的时候,这时候有两个 function 可以让我们介入 autotlayout 对 view layout 的操作:

viewWillLayoutSubviews, viewDidLayoutSubviews

UIView

UIView 初始化的方式:

  1. init(frame:) :纯 code layout UI 的初始化方法
  2. init(coder:) : Storyboard layout UI 的初始化方法
  3. awakeFromNib:在init(coder:) 呼叫後会呼叫这个 function

viewController产生的方法

  1. 从 storyboard 中初始化
  2. 呼叫 awakeFromNib()
  3. 呼叫 Segue 的准备方法
  4. 绑定 IBOutlets
  5. viewDidLoad()
  6. 显示於画面时:viewWillAppear -> viewDidAppear
  7. 离开画面时: viewWillDisappear -> viewDidDisappear
  8. 任何 layout view 时:viewWillLayoutSubviews -> viewDidLayoutSubviews

Reference : https://medium.com/@kuotinyen/ios-%E9%9D%A2%E8%A9%A6%E9%A1%8C-1-38dbc900d746


<<:  [Day 29 ] SQLite 上

>>:  (Medium) 31. Next Permutation

Alpine Linux Porting (一点二?)

今天稍微回头update一下musl这边的porting状况。 之前遇到message queue跟...

Spring boot 配置 Fluent bit 传递 Log

上篇文章透过 docker-compose 进行 Log 传递,这次则是使用 Spring boot...

突破自我设限

前言 今天聊「突破自我设限」,经过前面 20 几天,多数概念已经建构得差不多,是该来总览与整合。有时...

【修正模型】4-1 执行上下文(Execution Context)

经过了二十多天,一路上我们从基本的逻辑思考方式到了解 JavaScript 的意义,再从 JavaS...

[Day 27] 何谓趋势

N天後收盘价 若N天後收盘价 > 目前收盘价,趋势为正 若N天後收盘价 < 目前收盘价,...