โ init์ ํ๋ฉด loadView๊ฐ ๋ถ๋ฆด๊น?
๋ผ๋ ์ง๋ฌธ์ ์ต๊ทผ์ ๋ฐ์ ์ ์ด ์์ต๋๋ค.
์ฒ์์ ์ง๋ฌธ์ ๋ค์์๋๋ ๋น์ฐํ ๋ถ๋ฆฌ๊ฒ ์ง...? ์๋๊ฐ ..??? ํ๋ฉด์ ์ฝ๊ฐ ์ด์์ด ๋ฒ๋ฒ์ด ๋์๋๋ฐ..
์๊ฐํ๋ค๋ณด๋ ์ค์ ๋ก ๊ฐ๋ฐํ๋ฉด์ ์์ฃผ ์ฐ๋ viewDidLoad๋ viewWillAppear ๊ฐ์ ๋ฉ์๋ ๋ง๊ณ ๋ ํฌ๊ฒ ๊ด์ฌ ๊ฐ์ง ์์๋ ๊ฒ ๊ฐ๊ณ
๋น์ฐํ ์๋ค๊ณ ์๊ฐํ๋ life cycle์ ๋ํด ๋ด๊ฐ ์ ๋ชจ๋ฅด๊ณ ์๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๊ธฐ์ ์ด๋ ๊ฒ ๋ ๊น์ Life Cycle์ ๋ํด ์์ธํ ์์๋ณด๋ฉด์ ์ ์ง๋ฌธ์ ๋ํ ์ ๋ต์ ์ฐพ์๋ณด๋ ค๊ตฌ ํฉ๋๋ค.
UIViewController / UIView์ ๊ด๊ณ
Life Cycle! ์ด๋ผ๊ณ ํ๋ฉด ํ์์ View Life Cycle ์ด๋ผ๊ณ ๋ง์ด ๋ถ๋ ๋ ๊ฒ ๊ฐ์๋ฐ
๋จผ์ ๋ด๊ฐ ์์๋ณด๋ ค๊ณ ํ๋ Life Cycle์ด ๋๊ตฌ์ ์์ ์ฃผ๊ธฐ์ธ์ง ๋ฑ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.


์๋ ๊ฒ ๋ฒํผ ๋๊ฐ๊ฐ ์กด์ฌํ๋ ํ๋ฉด์ด ์๋ค๊ณ ํ์๋, Hierarchy๋ฅผ ์ฐ์ด๋ณด๋ฉด ์ค๋ฅธ์ชฝ ์ฒ๋ผ ๋์ค๊ฒ ๋ฉ๋๋ค.
ํฐ์ ํ๋ฉด ๋ถ๋ถ์ ์ก์์ Debug Navigator๋ก ๊ฐ๋ณด๋ฉด UIView ๋ผ๊ณ ๋น๋นํ๊ฒ ๊ฐ๋ฆฌํค๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ Constraints๋ UIView์ ํ์์ ์กด์ฌํ๋ ๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค.
์ ๋ฆฌํด๋ณด๋ฉด,
- UIViewController : ํ๋ฉด ์ ์ฒด์ ํ๋ฆ, ์ ํ, ์ฌ์ฉ์์์ ์ํธ์์ฉ ๊ด๋ฆฌ (navigation, modal, gesture ๋ฑ)
- UIView : ํ๋ฉด ์์ ๋ณด์ฌ์ง๋ UI ์์, ๋ ์ด์์(Constraints)๊ณผ ๊ทธ๋ฆฌ๊ธฐ(draw) ๋ด๋น
์๋ ๊ฒ ์ ๋ฆฌํ ์ ์๊ณ - ์ฐ๋ฆฌ๊ฐ ํ์์์ ๋งํ๋ Life Cycle์ UIViewController์ Life Cycle์ด๋ผ๊ณ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
UIViewContoller์ Life Cycle

์ผ๋จ Life Cycle์ ํ ๋์ ๋ณด๋ฉด ์๋ ๊ฒ ์๊ฒผ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ์๋ init / layoutSubviews / draw ๋ View์์ ํธ์ถ๋๋ ๋ฉ์๋๋ฅผ ์๋ฏธํฉ๋๋ค.
let vc = DetailViewController()
navigationController?.pushViewControllers(vc, animated: true)
์์ ๊ฐ์ด ๋ทฐ์ปจํธ๋กค๋ฌ๋ฅผ ํ๋ ์์ฑํด์ push ํ๋ ์ฝ๋๋ฅผ ์คํ์์ผฐ์๋ ํธ์ถ๋๋ ๋ฉ์๋๋ฅผ ์์๋๋ก ๋ฐ๋ผ๊ฐ๋ณด๊ฒ ์ต๋๋ค.
init
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด ํธ์ถํ๋ ๋ฉ์๋๋ก,
์ด๋ UIViewController์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ๋ฉ๋ชจ๋ฆฌ์ ํ์๋ฆฌ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค.


loadView
class DetailViewController: UIViewController {
override func loadView() {
// super.loadView()
view = MyCustomView()
}
}
- UIViewController๊ฐ ๋ด๋ถ์์ ๊ฐ๋ view๋ฅผ ์์ฑํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆผ
- UIViewController์ view๊ฐ nil์ธ ๊ฒฝ์ฐ loadView() ๋ด๋ถ์ ์ผ๋ก view์ ๊ธฐ๋ณธ์ผ๋ก UIView() ์์ฑํด์ ํ ๋น
- ์ง์ root view๋ฅผ ์ปค์คํ ํ view๋ก ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ super.loadView()๋ฅผ ์คํ์ํค์ง ์๊ณ ์ง์ ์์ฑ ํ ํ ๋น
- https://developer.apple.com/documentation/uikit/uiviewcontroller/loadview()
์๊ฑด ์๋์ ์ซ ๋ ์์ธํ ๋ณด๊ฒ ์ด๋๋น



๋ชป์๊ธฐ๊ธด ํ์ง๋ง Custom View์ ์ฌ์ด์ฆ ๊ณ ์ ํด๋ฒ๋ฆฌ๋ฉด ์์ ๋ทฐ์ปจ ์์ฒด๋ ์๋ ๊ฒ ์์์ง๋๋ค !
viewDidLoad
- ViewController ์์ View๊ฐ ์์ฑ๋์ด ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ ์ฌ๋ผ์จ ๋ค ํ ๋ฒ ํธ์ถ
- ๋ทฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ํ ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์ค๋ฉด ๋ ๋ค์ ํธ์ถ๋จ
- ํ๋ฉด ์ต์ด ์ง์
์ API ํธ์ถ์ด๋ addSubview, UI ์ด๊ธฐํ ์์
๋ด๋น
- view๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ์งํ ๋ฑ ํ ๋ฒ๋ง ํธ์ถ๋จ
- ์์ง ํ๋ฉด ์์ ๋ณด์ฌ์ง์ง ์์ง๋ง root view๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ - ๋ณด์ฌ์ง๊ธฐ ์ ์ subview ์ถ๊ฐ + ๋ ์ด์์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- https://developer.apple.com/documentation/uikit/uiviewcontroller/viewdidload()
viewWillAppear
- view๊ฐ View Hierarchy* ์์ ์ฌ๋ผ์ค๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ๋ฉ์๋
- *View Hierarchy์ ์ฌ๋ผ์จ๋ค๋ ๊ฒ์ ๋ทฐ๋ค์ด ์๋ก ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก ์ฐ๊ฒฐ๋์ด ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ์กํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ์กํ๋ฉด ํ๋ฉด ์์์ ํ์ธ ๊ฐ๋ฅํด์ง
- ๋ฉ๋ชจ๋ฆฌ์ ์๊ด์์ด ํ๋ฉด ์์ ๋ณด์ฌ์ง ๋๋ง๋ค ํธ์ถ
- ๋ฉ๋ชจ๋ฆฌ์๋ ์ด๋ฏธ ์ฌ๋ผ์์๋ ์ํ์ด๊ณ , ํด๋น ๋ทฐ์ปจ ์๋ก ๋ค๋ฅธ ๋ทฐ์ปจ์ด push๋๊ฑฐ๋ present๋๋๋ผ๋ ํด๋น ๋ทฐ์ปจ์ด ๋ฉ๋ชจ๋ฆฌ ํด์ ๋์ง ์์ -> viewDidLoad๋ ๋ถ๋ฆฌ์ง ์๊ณ viewWillAppear๋ง ๋ฐ๋ณต ํธ์ถ
- ํ๋ฉด ์ ํ ํ์ ๋ฐ๋ก UI๋ ๋ฐ์ดํฐ ๊ฐฑ์ ์ด ํ์ํ ๊ฒฝ์ฐ ํด๋น ๋ฉ์๋ ๋ด๋ถ์์ ์ฒ๋ฆฌ
- https://developer.apple.com/documentation/uikit/uiviewcontroller/viewwillappear(_:)

viewWillLayoutSubViews
- ViewController์ root view๊ฐ ๋ด๋ถ์ ์ผ๋ก layoutSubviews๋ฅผ ํ๊ธฐ ์ ์ ํธ์ถ๋๋ ๋ฉ์๋
- view ๋ด๋ถ์ subview๋ค์ด View Hierarchy์ ์ฌ๋ผ์ค๊ธฐ ์ง์ ํธ์ถ๋๋ฉฐ, ์์ง subview๋ค์ frame๊ณผ bounds๊ฐ ํ์ ๋์ง ์์ ์ํ

[UIView] layoutSubviews
- view ๋ด๋ถ์ subview๋ค์ frame๊ณผ bounds๋ฅผ ๋ฐฐ์นํ๋ ๋ฉ์๋
- UIKit์ด Auto Layout ์ ์ฝ ์กฐ๊ฑด์ ๋ฐ๋ผ subview ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ ๋ ํธ์ถ๋จ
- ํธ์ถ ์์
- view๊ฐ ๋ก๋๋ ๋ (์๋ ํธ์ถ)
- view ๋ด์์ bounds๋ constraints๊ฐ ๋ณ๊ฒฝ๋ ๋ (์๋ ํธ์ถ)
- setNeedsLayout() ๋๋ layoutIfNeeded() ํธ์ถํ ๋ (๊ฐ์ ํธ์ถ)
- setNeedsLayout : ๋ทฐ์ ๋ ์ด์์ ๊ฐฑ์ ์ด ํ์ํด! ๋ผ๊ณ ์๋ฆฌ๋ ์ญํ , ์ฆ์ ๋ ์ด์์์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ค์ ๊ฐฑ์ ์์ ์๋์ผ๋ก layoutSubviews๋ฅผ ํธ์ถํ๋๋ก ์์ฝ
- layoutIfNeeded : ์ง๊ธ ๋ฐ๋ก ๋ ์ด์์ ๊ฐฑ์ ํด! ๋ผ๊ณ ํ๋ ์ญํ , ์ฆ์ layoutSubviews๊ฐ ํธ์ถ๋จ
viewDidLayoutSubviews
- ViewController์ root view๊ฐ ๋ด๋ถ์ ์ผ๋ก layoutSubviews๋ฅผ ์๋ฃ ํ ํธ์ถ๋๋ ๋ฉ์๋

- view ๋ด๋ถ์ subviews๋ค์ด View Hierarchy์ ์ฌ๋ผ์๊ธฐ ๋๋ฌธ์, subviews๋ค์ frame๊ณผ bounds๊ฐ ํ์ ๋จ
- ๊ทธ์น๋ง ์์ง ๋์ ๋ณด์ฌ์ง์ง ์์
- view ๋ด๋ถ subviews๋ค์ด ์๋ก์๋ก ๊ณ์ธต์ด ์กํ๊ฑฐ๊ณ , root view๋ ์์ง View Hierarchy์ ์ฌ๋ผ์ค์ง ์์
- ๋ ์ด์์ ํ ํ์ฒ๋ฆฌ๋, frame ๊ธฐ๋ฐ์ UI ์
๋ฐ์ดํธ, animation ์ค๋น ์ฒ๋ฆฌ
- ex) width๊ฐ ๋์ ์ธ ๋ทฐ์ radius๋ฅผ ๋น์จ์ ๋ฐ๋ผ ์ ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, ๊ณ์ฐ๋ frame ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ์ฉ
- https://developer.apple.com/documentation/uikit/uiviewcontroller/viewdidlayoutsubviews()
viewDidAppear
- UIViewController ๋ด์ root view์ธ view๊น์ง View Hierarchy์ ์ฌ๋ผ์จ ํ ํธ์ถ๋๋ ๋ฉ์๋
- ๋ฉ๋ชจ๋ฆฌ์๋ ๋น์ฐํ ์ด๋ฏธ ์ฌ๋ผ๊ฐ์๊ณ , ํ๋ฉด ์์๋ ๋ณด์ฌ์ง๋ ์ํ

- ํ๋ฉด ์ง์ ํ ๋ฐ๋ก ์ ๋๋ฉ์ด์ ์ ์คํ์ํค๊ฑฐ๋ UI ์ ๋ฐ์ดํธ ์ก์ ๋ฑ์ด ๋ณด์ฌ์ผ ํ ๋ ์ฌ์ฉ
- https://developer.apple.com/documentation/uikit/uiviewcontroller/viewdidappear(_:)/
[UIView] draw(_:)
- UIKit์์ ์ ๊ณตํ๋ Core Graphics ๊ธฐ๋ฐ์ ๊ทธ๋ฆฌ๊ธฐ ํจ์๋ก, ํ๋ฉด์ UIBezierPath, CGGradient ๊ฐ์ ์ปค์คํ ๊ทธ๋ํฝ์ ๊ทธ๋ฆผ
- ํธ์ถ ์์
- view๊ฐ ๋ก๋๋ ๋ ์ปค์คํ ๊ทธ๋ํฝ์ ๊ทธ๋ ค์ผ ํ๋ ๊ฒฝ์ฐ viewDidAppear์์ (ํญ์ ํธ์ถ X, ํ์์ ๋ฐ๋ผ)
- setNeedsDisplay() ํธ์ถ๋ ๋
- https://developer.apple.com/documentation/uikit/uiview/draw(_:)
์ฌ๊ธฐ๊น์ง ํ๋ฉด ํ๋ฉด์ด ๋ณด์ฌ์ง๊ธฐ ์ํด ์คํ๋๋ ๋ฉ์๋ ๋ - ์ด์ ํ๋ฉด์์ ์ฌ๋ผ์ง ์ฐจ๋ก
// DetailViewController์์
navigationController?.popViewController(animated: true)
viewWillDisappear
- ViewController๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ๋ฉ์๋๋ก, ํ๋ฉด ์ ํ ์ ๋๋ฉ์ด์ ์์ ์ ์ ํธ์ถ
- View Hierarchy์ ์กด์ฌํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ ์์ง ํด์ ๋์ง ์์ ์ํ

- ํ์ด๋จธ, ์ ๋๋ฉ์ด์ ์ค๋จ, ๋คํธ์ํฌ ์์ฒญ ์ทจ์, ์ ์ค์ฒ ์ ๋ฆฌ ๋ฑ์ ์์ ์ ์ํ
- swipe back ์ ์ค์ฒ๋ฅผ ์์ํ๋ฉด ํธ์ถ๋จ
- ์ ์ค์ฒ๋ฅผ ์ค๊ฐ์ ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ฉด ๋ค์ viewWillAppear - viewDidAppear ์์ผ๋ก ํธ์ถ๋จ
- -> viewWillDisappear๊ฐ ํธ์ถ๋๋ค๊ณ ํด์ ํด๋น ๋ทฐ์ปจ์ด ํด์ ๋จ์ ๋ณด์ฅํ ์ ์์

viewDidDisappear
- ํ๋ฉด ์์์ ์ฌ๋ผ์ง ํ์ ํธ์ถ
- View Hierarchy์์ ์ฌ๋ผ์ก์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๋ ํด์ ๋๊ธฐ ์ ์ ์ํ


- NotificationCenter, Observer ๋ฑ ํด์ ์์ ์คํ
- https://developer.apple.com/documentation/uikit/uiviewcontroller/viewdiddisappear(_:)/
deinit
- ViewController ๊ฐ์ฒด๊ฐ ARC์ ์ํด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ํธ์ถ
- ARC (Automatic Reference Counting)
- Swift, Objective-C์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ์์คํ
- ์ฐธ์กฐ ํ์ ์ธ Class์ ๋ํด์ ์๋์ผ๋ก ์ฐธ์กฐ๊ฐ ๋ช๊ฐ ์กด์ฌํ๋์ง ์นด์ดํ ํ๊ณ , ์นด์ดํธ๊ฐ 0์ด ๋๋ ์๊ฐ ARC์์ deinit ํธ์ถ
loadView ์ง์คํด์ ๋ณด๊ธฐ
init์ ํ๋ฉด loadView๊ฐ ๋ถ๋ฆฐ๋ค?
๋งจ ์ฒ์ ์์์ด์๋ ์ง๋ฌธ์ผ๋ก ๋์๊ฐ๋ณด๊ฒ ์ต๋๋ค.
โ init์ ํ๋ฉด loadView๊ฐ ๋ถ๋ฆด๊น?
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด โ ์ ๋๋ค.
UIViewController์ init๊ณผ loadView์ ์ ์๋ฅผ ๋ค์ ๋ณด๋ฉด
init์ UIViewController ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด๊ณ loadView๋ UIViewController ์์ root view๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
loadView๋ root view๊ฐ ์ง์ ์ ์ผ๋ก ํ์ํด์ง๋ ํธ์ถ๋๋ lazy ๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์
๋จ์ํ ์์ ๊ฐ์ฒด์ธ UIViewController๋ฅผ ์์ฑ๋ง ํ์๋์๋ loadView๊ฐ ํธ์ถ๋์ง ์์ต๋๋ค.
๊ทธ๋ผ root view๊ฐ ํ์ํ ๋๋ ์ธ์ ์ผ๊น์ฌ ?
vc.view ์ ๊ฐ์ด ์ง์ ์ ์ผ๋ก view๋ฅผ ํธ์ถํ๊ฑฐ๋, ํ๋ฉด ์ ํ์ ํตํด view๊ฐ ๊ทธ๋ ค์ ธ์ผ ํ๋ ๊ฒฝ์ฐ UIViewController์์๋ view๋ฅผ ํ์๋ก ํฉ๋๋ค.
// init ํธ์ถ
let vc = ViewController()
// loadView ํธ์ถ
view.addSubview(vc.view)
// init + loadview + viewDidLoad + ... ํธ์ถ
let otherVC = OtherViewController()
navigationController?.pushViewController(otherVC, animated: true)
์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ์ ์ํฉ์ผ๋ init์ ๋์ง๋ง, loadView๋ ํธ์ถ๋์ง ์๋๋ค๊ณ ํ ์ ์์ต๋๋ค ๐ฅฒ
- view์ ํ ๋ฒ๋ ์ ๊ทผํ์ง ์์ ๊ฒฝ์ฐ
- push / present / addSubview ๋์ง ์์ ๊ฒฝ์ฐ
- addChild๋ง ํ๊ณ view๋ฅผ ๊ณ์ธต์ ๋ฃ์ง ์์ ๊ฒฝ์ฐ
- init์์ ์๋ฌด view ์ ๊ทผ ์ฝ๋๋ฅผ ์ฐ์ง ์์ ๊ฒฝ์ฐ
ex) ๊ฐ์ฒด๋ง ์์ฑํ๊ณ push๋ฅผ ํ์ง ์์ ๊ฒฝ์ฐ -> init ํ์ ๋ฐ๋ก deinit๋จ
let vc = DetailViewController()
// navigationController?.pushViewController(vc, animated: true)
class DetailViewController: UIViewController {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
print("โ
init")
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func loadView() {
view = MyCustomView()
print("loadView") // โ
}
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad") // โ
}
...
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("viewDidDisappear") // โ
}
deinit {
print("โ
deinit")
}
}
/*
โ
init
โ
deinit
*/

์์ ๊ฐ์ ์ฝ๋์์๋ root view๋ฅผ ์์ฑํ๋ loadView()๋ฅผ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ MyCustomView๋ ๋น์ฐํ ์์ฑ๋์ง ์์ต๋๋ค.
๊ทธ๋ผ loadView๋ ์ lazy ์ผ๊น์ ?
1. ๋ถํ์ํ view loading์ ๋ง์์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ
UI ๊ฐ์ฒด๋ init๋ง ํ๊ณ ์ฆ์ ๋ณด์ฌ์ง์ง ์๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ปด์ผ ํ๋ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ๊ตณ์ด ๋ณด์ด์ง๋ ์๋๋ฐ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ค๋ณด๋ ์ง์ง๋ก ํ์ํด์ง ๋๊น์ง view ์์ฑ์ ์ต๋ํ ๋ฆ์ถฐ ๋ถํ์ํ view์ loading์ ๋ง๋ ๊ฒ์ด์ฃต
2. ์คํ ๋ฆฌ๋ณด๋ / ์ฝ๋๋ฒ ์ด์ค ์์์ ๋ทฐ ๋ก๋ฉ ๋ก์ง ํตํฉ
super.loadView()๋ ๋ด๋ถ์ ์ผ๋ก view๊ฐ ์์๋ UIView()๋ฅผ ์์ฑํด์ ํ ๋นํด์ฃผ๋ ๋ฉ์๋์ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ loadView๋ฅผ override ํ์๋ ์คํ ๋ฆฌ๋ณด๋ ๋ฐฉ์๊ณผ ์ฝ๋๋ฒ ์ด์ค ๋ฐฉ์์์์ ๋ด๋ถ ๋์์ด ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค.
- ์คํ ๋ฆฌ๋ณด๋ ๋ฐฉ์ : ๊ตฌ์ฑ๋์ด์๋ nib ๊ฐ์ฒด๋ฅผ ๋ก๋
- ์ฝ๋๋ฒ ์ด์ค ๋ฐฉ์ : overrideํด์ UIView ์ฃผ์ ๋๋ ์ปค์คํ view ์ฃผ์
// ์ฝ๋๋ฒ ์ด์ค
override func loadView {
super.loadView() // view๊ฐ ์์ผ๋๊น UIView() ์์ฑํด์ ํ ๋น
}
// ์ฝ๋๋ฒ ์ด์ค (์ปค์คํ
๋ทฐ, ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ๋ฒ์ )
override func loadView {
super.loadView() // view๊ฐ ์์ผ๋๊น UIView() ์์ฑํด์ ํ ๋น
view = CustomView() // ์ปค์คํ
๋ทฐ๋ก ๋ฐ๊ฟ์น๊ธฐ
}
// ์ฝ๋๋ฒ ์ด์ค (์ปค์คํ
๋ทฐ, ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ๋ฒ์ )
override func loadView {
view = CustomView() // ๋น์ด์๋ view์ ์ปค์คํ
๋ทฐ ์์ฑํด์ ํ ๋น
}
// ์คํ ๋ฆฌ๋ณด๋
override func loadView {
super.loadView() // ์คํ ๋ฆฌ๋ณด๋์์ ์์ฑํ view(nib)๋ฅผ ๋ก๋ํด์ค๊ธฐ ๋๋ฌธ์ view๊ฐ ์์ -> UIView() ์์ฑํด์ ํ ๋นํ์ง ์์
}
// ์คํ ๋ฆฌ๋ณด๋ (๋ฎ์ด์ฐ๊ธฐ)
override func loadView {
view = CustomView() // ์คํ ๋ฆฌ๋ณด๋์์ ์์ฑํ view๋ฅผ ๋ฎ์ด์ฐ๊ธฐํจ
}
*์คํ ๋ฆฌ๋ณด๋์์๋ override๋ฅผ ๊ถ์ฅํ์ง ์์.
loadView์์ override ํด์ ์๋ก์ด ์ปค์คํ view๋ฅผ ํ ๋นํด๋ฒ๋ฆฌ๋ฉด, ์คํ ๋ฆฌ๋ณด๋์์ ๋ง๋ค์ด๋ UI๋ฅผ ๋ฎ์ด๋ฒ๋ฆผ


์๋ฌดํผ ๊ทธ๋์
์คํ ๋ฆฌ๋ณด๋ ๋ฐฉ์์ผ๋๋ ์ฝ๋๋ฒ ์ด์ค ๋ฐฉ์์ผ๋์ view ์ด๊ธฐํ ํ๋ฆ์ ํต์ผํ๊ธฐ ์ํด
loadView()๋ lazyํ๊ฒ ํธ์ถ๋๋๋ก ์ค๊ณ๋์ด์์ต๋๋ค.
loadView ์ฌ์ฉ์ ์ฃผ์์ฌํญ
1. ์ง์ ์ปค์คํ view๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒฝ์ฐ super.loadView() ํธ์ถ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์๋๋๊ฑด ์๋. ๊ทธ์น๋ง ๋นํจ์จ์ ์ธ ๋๋
override func loadView() {
super.loadView() // view = UIView() ์์ฑ๋ ์ํ
// โก๏ธ OS์์ ์์ฒด ์์ฑํ UIView ๋ฉ๋ชจ๋ฆฌ ์ฃผ์: ObjectIdentifier(0x0000000102709990)
view = MyCustomView()
// โก๏ธ ์ฝ๋๋ก ์ง์ ๋ฃ์ด์ค MyCustomView ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ : ObjectIdentifier(0x0000000102604b10)
}
์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ธฐ์ค์ผ๋ก super.loadView() ํ๋ ์์ ์ ๋ด๋ถ์ ์ผ๋ก UIView()๋ฅผ ์์ฑํด์ self.view์ ํ ๋น์ ํด์ฃผ๋๋ฐ
์ดํ์ ๋ฐ๋ก ์๋ก์ด ์ปค์คํ ๋ทฐ๋ฅผ ์์ฑํด์ ๋ฃ์ด์ฃผ๋ฉด, ๊ธฐ์กด์ ์์ฑํ๋ ๋ทฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๋ค๊ฐ ๋ฐ๋ก ๋ฒ๋ ค์ง๊ฒ ๋ฉ๋๋ค.
์ฆ, ์๋๋๊ฑด ์๋์ง๋ง ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅํ์ง ์๋๋ค~ ์ด๋ฐ ๋๋์ ๋๋ค.
2. loadView๋ฅผ override๋ง ํ๋ฉด ์๋ฉ๋๋ค.
์๋ํ๋ฉด ํฌ๋์ ๋๋ฒ๋ฆผ !

class ViewController: UIViewController {
override func loadView() {
// super.loadView()
// view = MyCustomView()
os_signpost(.event, log: log, name: "#0 loadView")
}
override func viewDidLoad() {
super.viewDidLoad()
os_signpost(.event, log: log, name: "#1 viewDidLoad")
setUI()
getCurrentWeather()
}
}
์ ํฌ๋์๊ฐ ๋๋๋ฉฐ๋
loadView๋ view๊ฐ nil์ผ๋ ํธ์ถ๋์ด์ view์ ๊ฐ์ฒด๋ฅผ ํ ๋นํด์ฃผ๋ ์ญํ ์ ๋ฉ์๋์ธ๋ฐ
์ ์ฝ๋์ฒ๋ผ ๋ด๋ถ์์ super.loadView()๋ ์ํ๊ณ ์ง์ view๋ฅผ ๋ฃ์ด์ฃผ์ง๋ ์์๋ฒ๋ฆฌ๋ฉด
viewDidLoad์ ๋์ด๊ฐ๋ค๊ฐ view๊ฐ ๋น์ด์์ผ๋ ๋ค์ loadView๊ฐ ํธ์ถ๋๊ณ ๋ ๋ค์์ viewDidLoad๊ฐ ํธ์ถ๋๋๋ฐ ๋ view๊ฐ ๋น์ด์์ผ๋๊น ๋ ๋ค์ loadView๊ฐ ํธ์ถ๋๊ณ ..
๋๋ฆฌ๋๋ฆฌ ๋๋ค๊ฐ ๊ฒฐ๊ตญ ํฐ์ ธ๋ฒ๋ฆฌ๊ฒ ๋ฉ๋๋ค.


์ฌ์ค loadView๋ฅผ overrideํด์ ์ธ ์ผ์ด ๊ทธ๋ค์ง ๋ง์ง ์์ ๊ฒ ๊ฐ์์ ๋ชฐ๋ผ๋ ํฐ ๋ฌธ์ ๋ ์๊ฒ ์ง๋ง
ํธ์ฅ์๋ ์ง์ ์ปค์คํ ํ ๋ทฐ๋ฅผ ๋ฃ์ด์ค์ผ ํ ์ผ์ด ์๊ธด๋ค๋ฉด ๊ผฌ์ฅ ์ฃผ์ํ์๊ธธ ๋ฐ๋๋๋น
๊ฒฐ๋ก ์ init ํ๋ค๊ณ ํด์ loadView๊ฐ ๋ถ๋ฆฌ์ง ์๋๋ค
์ ๋๋น
์ด์ ์์ผ loadView๊ฐ ๋ญํ๋ ๋ ์์ธ์ง ์ ํํ๊ฒ ์๊ฒ ๋ ๊ฒ ๊ฐ์ด๋ค ๐ฅน
๋ง์ง๋ง์ผ๋ก UIViewController ๋ฉ๋ชจ๋ฆฌ๋ ๋ทฐ ๊ณ์ธต ๊ด์ ์์ ๋ณด๋ Life Cycle ๋ณด๋ฉด์ ๋ง๋ฌด๋ฆฌ

'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [iOS] ํธ์์๋ฆผ ๋ฐ์์ ์ฒ๋ฆฌํ๊ธฐ (1) | 2022.10.12 |
|---|---|
| [iOS] Compositional Layout ๐โโ๏ธ (0) | 2022.09.05 |
| [iOS] ์ปดํฌ๋ํธ๋ฅผ ์ฝ๋๋ฒ ์ด์ค, ์คํ ๋ฆฌ๋ณด๋์์ ๋๋ค ์ธ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ๐ฏ (1) | 2022.05.30 |
| [iOS] RxDataSource ๐ก (0) | 2022.05.17 |
| [iOS] Haptic ์ฌ์ฉ๋ฒ๐ (0) | 2022.04.23 |