ํฐ์คํ ๋ฆฌ ๋ทฐ
๐น View Controller
๐ฏ View Controller๋?
View Controller๋ iOS ์ฑ์ ๊ฐ์ฅ ๊ธฐ์ด๊ฐ ๋๋ ๋น๋ฉ ๋ธ๋ก์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ฑ์ ์ต์ ํ ๊ฐ์ View Controller๋ฅผ ๊ฐ์ง๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ๊ฐ์ View Controller๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
ํ๋์ view controller๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ UI ๋๋ ์คํฌ๋ฆฐ(a single User Interface or screen)์ ๊ด๋ฆฌํฉ๋๋ค. ๋ํ UI์ ๋ชจ๋ธ(underlying data)๋ค ์ฌ์ด์ ์ํธ์์ฉ์ ๊ด๋ฆฌํฉ๋๋ค.
์์๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค!
class MainViewController: UIViewController { @IBOutlet weak var textLabel:UILabel? override func viewDidLoad() { super.viewDidLoad() textLabel?.text = "Click the button..." } @IBAction func onButtonTap(sender: UIButton) { textLabel?.text = "Hello world!" } }
์์ ์์๋ฅผ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค โบ๏ธ
์ฐ์ MainViewController๋ผ๋ ViewController๋ฅผ ์์ฑํ์ต๋๋ค. view controller๋ UIViewController๋ฅผ ์์๋ฐ์ต๋๋ค. ์ด ํด๋์ค๋ Optional UILabel ํ์ ์ธ ํ๋กํผํฐ textLabel์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํ๋กํผํฐ์ธ textLabel์ outlet์ ๋๋ค. ์ฌ๊ธฐ์ outlet์ ์ฌ์ ์ ์๋ฏธ๋ ์ถ๊ตฌ, ๋ฐฐ์ถ๊ตฌ, ํํ์ ์๋จ ๋ฑ์ผ๋ก ๋ณผ ์ ์๋๋ฐ์, @IBOutlet์
'InterfaceBuilder'๋ฅผ ์ฌ์ฉํด์ UI์์ 'label๊ณผ outlet connnection์ ๋ง๋ค์ ์๋ค'
๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ์ด ๋ณ์๋ฅผ ํตํด textLabel?.text์์ .text์ ๊ฐ์ ๋ ์ด๋ธ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๊ทธ ๋ค์ ๋ฉ์๋์ธ viewDidLoad๋ฅผ ๋ณด๋ฉด override๊ฐ ๋์ด์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ์, ์์ ๋ฐ์ ๋ฉ์๋๋ผ๋ ์๋ฏธ์ด๊ธฐ ๋๋ฌธ์ UIViewController์์ ์ด๋ฏธ ์ ์๋์ด ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ view controller life cycle์ ์ผ๋ถ์ด๋ฉฐ view controller์ ์ผ๋ฐ์ ์ธ ์์์ ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฉ์๋์ธ onButtonTap(sender:)๋ @IBAction์ผ๋ก ์ ์๋์ด ์์ต๋๋ค. ์์ IBOutlet๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Interface Builder๋ฅผ ํตํด ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ ๋จ์ํ ์ฐ๊ฒฐ์ ์๋ฏธํ๋ Outlet๊ณผ ๋ค๋ฅด๊ฒ ์ด๋ค ๋์์ ์ผ์ผํจ๋ค๋ ์ธก๋ฉด์์ Action์ด๋ผ๋ ๋ค์ด๋ฐ์ด ๋ถ์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ชจ๋ view controller์๋ view property๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ตญ view controller๋ผ๋ ๊ฒ์ view๋ค์ controller๋ผ๊ณ ์ ์ํ ์ ์์ต๋๋ค. ์ฝ๋์์๋ UIViewController ํด๋์ค์ view property๋ฅผ ํตํด view์ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค. ์์๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค!
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด View Controller ์์๋ ํ๋กํผํฐ๋ก Table View๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ Table View ์์๋ Item Cell์ด๋ผ๋ ์์๊ฐ ์กด์ฌํ๊ณ ๊ทธ ์์ ๋ค์ Content View๊ฐ ์กด์ฌํฉ๋๋ค. ์ด Content View๋ถํฐ ์ดํด๋ณด๋ฉด ContentView๋ ์๋ ๋ ์ด๋ธ๋ค์ Super View๊ฐ ๋๋ฉฐ, ๋ ์ด๋ธ์ด๋ ๋ฒํผ, ์ธ๋ค์ผ ๋ฑ์ Sub View๊ฐ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ View๋ผ๋ ์ด๋ฆ์ด ๋ถ์ ์์ ๋ฟ๋ง ์๋๋ผ ๋ฒํผ ๋ฑ๋ view๋ก ์ดํดํด์ผํ๋ค๋ ์ ์ ๋๋ค.
์ด์ ๋ถํฐ ์กฐ๊ธ๋ ์์ธํ View Controller์ ๋ํด ์ดํดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค ๐ฏ
๐ Views, Storyboards, MVC and Controllers
๋ฐ๋ก ์์์ view๋ผ๋ ๊ฒ์ view controller์์ ํ๋กํผํฐ๋ก ์กด์ฌํ๋ค๋ ๊ฒ์ ์ด์ผ๊ธฐํ์์ต๋๋ค. ๋ฐ๋๋ก ๋งํ๋ฉด ๋ชจ๋ view controller๋ view ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด๊ณ controller๋ ์์ฐ์ค๋ฝ๊ฒ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ iOS์ View Controller๋ฅผ ํ์ตํ๋ค๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฐ ์ง๋ฌธ์ด ๋ ์ค๋ฅด๊ฒ ๋ฉ๋๋ค.
"๊ทธ๋์ view controller๋ MVC ์ค View์ธ๊ฐ Controller์ธ๊ฐ?"
๊ฒฐ๋ก ๋ถํฐ ์ด์ผ๊ธฐ ํ๋ฉด, view controller๋ view์ธ ๋์์ controller์ ๋๋ค(์๋ฌธ์์๋ mix๋ผ๊ณ ํํํ๋๋ฐ ํ๋ฌดํ๋ธ..). iOS์์๋ MVC๋ฅผ ์นผ๊ฐ์ด ๋๋๋ ๊ฒ์ด ์๋๋ผ view controller ์์ View์ Controller๋ผ๋ ๊ฐ๋ ์ ํจ๊ป ๋ฌถ์์ต๋๋ค.
์์๋ก UITableViewController๋ฅผ ๋ณด๋ฉด ์ด ํด๋์ค๋ ์คํฌ๋ฆฐ์ UI ํ ์ด๋ธ์ ๋ณด์ฌ์ฃผ๋ ๋์์ ๋ท๋จ์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๋ ํฉ๋๋ค. ์๋์ ์ฝ๋ฉํธ๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
The dual role of the view controller is often criticized, and for good reason. Itโs easy to dump a whole lot of code into a view controller. Youโd let the view controller do everything in your appโs UI, from organizing the view, to networking, user interaction, and controlling data models. This often results in whatโs called Massive View Controller ...
view controller๋ View์ ์ญํ ๊ณผ Controller์ ์ญํ ์ ๋ชจ๋ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ฌด ๋ง์ ๊ธฐ๋ฅ๋ค์ด ํ ๊ณณ์ ๋ชจ์ผ ๊ฐ๋ฅ์ฑ์ด ์๊ณ , ๊ฐ์ฒด์งํฅ์ ํน์ฑ์ ํน์ ํ๋์ ๊ฐ์ฒด๊ฐ ๋๋ฌด ๋ง์ ๊ถํ๊ณผ ์ฑ ์์ ๊ฐ๋ ๊ฒ์ ๊ฑด๊ฐํ์ง ๋ชปํ(?) ๊ตฌ์กฐ๊ฐ ๋๊ธฐ ์ฌ์ธ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ํผํ๋ ๋ฐฉํฅ์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ ํ์๊ฐ ์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์์ต๋๋ค.
๋ํ ์๋์ ์ฝ๋ฉํธ ์ญ์ ํจ๊ป ์ฝ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
In practical iOS development, you donโt create your UIs manually with Swift code. Itโs more productive to use XIBs or Storyboards with Interface Builder, to visually build UIs. Interface Builder also has helpful tools to create responsive layouts for different iPhone device models and screen sizes.
iOS ๊ฐ๋ฐ์์ UI๋ฅผ Swift code๋ก ์๋ ๊ตฌํ ํ์ง ์๊ณ XIB๋ ์คํ ๋ฆฌ๋ณด๋๋ฅผ ํตํด์ ๊ตฌํํ๋ค๋ ๊ฒ์ธ๋ฐ ์ด๊ฒ์ ๋ ผ์ ๊ฐ๋ฅํ ํํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ ๋์ ์ฅ๋จ์ ๊ณผ ์ฝ๋๋ฅผ ํ์ฉํ UI ๊ฐ๋ฐ์ ์ฅ๋จ์ ์ด ๋ช ํํ ์กด์ฌํ๋ฏ๋ก ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ํธ๋๋ ๋ฐฉ์์ด ๋ค๋ฅด๊ณ , ๋ง์ ํ์ ์์ ์คํ ๋ฆฌ๋ณด๋๋ณด๋ค ์ฝ๋๋ฅผ ํ์ฉํด UI๋ฅผ ๊ทธ๋ฆฐ๋ค๊ณ ์๊ณ ์์ต๋๋ค.
ํน์ XIB๋ Storyboard๊ฐ ๋ฌด์์ธ์ง ํท๊ฐ๋ฆฌ์๋ ๋ถ๋ค์ ์ํด ๊ฐ๋ณ๊ฒ ์ค๋ช ํ๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
XIB: XML ๊ธฐ๋ฐ์ UI ํ์ผ์ ๋๋ค. ํ๋์ UI์ ๋ํ ์ ๋ณด๋ค์ ๋ด๊ณ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก view๋ view controller์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
Storyboard: ์คํ ๋ฆฌ๋ณด๋๋ XIB์ ๋น์ทํ ๊ฐ๋ ์ผ๋ก ํ๋ ์ด์์ UI์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๋๋ค. segue๋ผ๋ ํ๋ฉด์ ํ ๊ธฐ๋ฒ์ ํตํด view controller๊ฐ ์ ํ์ด ์ผ์ด๋ฉ๋๋ค.
๋ ๊ฐ๋ ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ์คํ ๋ฆฌ๋ณด๋๊ฐ ์ผ๋ฐ์ ์ผ๋ก 2๊ฐ ์ด์์ view controller๋ฅผ ๋ด๋๋ค๋๋ฐ ์์ต๋๋ค. ๋ํ XIB๋ ํ๋์ ๋ทฐ๋ฅผ ํํํ๋ ๋ฐ๋ฉด Storyboard๋ ์ฌ๋ฌ๊ฐ์ ๋ทฐ๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ์ ๋ํ ๊ฐ๋ ์ด ํฌํจ๋ฉ๋๋ค.
ํ๋ ์ถ๊ฐ๋ก ์ฒจ์ธํ์๋ฉด, XIB์์ ์ค์ํ ๊ฐ๋ ์ด File's Owner๋ผ๋ ๊ฒ์ ๋๋ค. File's Owner๋ ๋ฐํ์ ์ XIB๋ฅผ ๋ถ๋ฌ์ค๋ ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ง ๊ทธ๋๋ก Interface Builder file์ "own(์์ )"ํ๋ ๊ฒ์ธ๋ฐ ์ด ์ฐ๊ฒฐ์ด ๋ทฐ์ปจํธ๋กค๋ฌ์ XIB๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
๐ง ๊ทธ๋ผ NIB๋ ๋ฌด์์ธ๊ฐ์?
XIB๋ ์์์ ์ธ๊ธํ๋๋ก ํธ์ง ๊ฐ๋ฅํ XML ํ์์ Interface Builder ํ์ผ์ ๋๋ค. NIB๋ ๋ฐฐํฌ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ ํฌ๋งท์ ํ์ผ๋ก app binary package์ ์ ์ฅ๋ฉ๋๋ค.
๐ UI๋ฅผ ์ฝ๋์ ์ฐ๊ฒฐํ๊ธฐ
์ผ๋ฐ์ ์ผ๋ก UI์ view controller๋ฅผ ์ฐ๊ฒฐํ ๋ control ๋ฒํผ์ ๋๋ฅธ ์ํ๋ก ๋์ด๋น๊ฒจ ์ฐ๊ฒฐ์ ํ์์ต๋๋ค. ํน์ hierarchy์์ inspector tab์ ์ง์ ์ฐ๊ฒฐํ ์๋ ์๊ฒ ์ฃ ? ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ Storyboard์์ ์ฌ์ฉํ ๋์ ๋ฐฉ์์ ๋๋ค. ๋ง์ฝ XIB์ ์ฐ๊ฒฐํ๋ค๊ณ ํ๋ฉด view controller์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์๋๋ผ File's Owner์ ์ฐ๊ฒฐํด์ผํฉ๋๋ค.
๐ง ์ textLabel ๋ฑ์ ์ ์ธํ ๋ ๋ํดํธ๊ฐ weak var(์ฝํ ์ฐธ์กฐ)๋ก ์ ์ธ๋ ๊น?
์ฝํ ์ฐธ์กฐ์ ๊ฐ๋ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ธ ๊ด์ ์ด ์๋๋ผ ์กฐ๊ธ ๋จ์ํ ์์ผ์ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ๋จํ ๋งํ๋ฉด ์ด๊ฒ์ UI ์์(์ฌ๊ธฐ์๋ Label)๊ณผ view controller๊ฐ ์ฝํ ๊ฒฐํฉ์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. Strongํ retain cycle์ด ์๊ฒจ memory leak์ด ์๊ธฐ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฒ์ด์ฃ .
weak type์ผ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ์์ ์ ์ธ์ nil๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ํญ์ ์ต์ ๋ ํ์ ์ผ๋ก ์ ์ธ๋์ด์ผ ํฉ๋๋ค. ๋ํ viewDidLoad()๊ฐ ์คํ๋๊ธฐ ์ ์ outlet ํ๋กํผํฐ๋ค์ nil ๊ฐ์ ๊ฐ์ต๋๋ค. ์์ธ๋ ๊ฐ์ ์ต์ ๋๋ก ์ค์ ํ๋ฏ๋ก์จ ์ด ๊ฐ์ด nil์ผ ๋ ์ค์๋ก ์ฐธ์กฐํ๋ ์ํฉ์ ๋๋นํด์ค๋๋ค.
๊ทธ๋ผ ์ฐ์ Strongํ๊ฒ ์ ์ธํด๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋ ์ํฉ์ ๊ฐ์ ํด๋ณผ๊น์?
ViewController๊ฐ ์์
ViewController๊ฐ Strongํ๊ฒ someView๋ฅผ ์์
IB์์ SomeView๊ฐ Label์ SubView๋ก Strongํ๊ฒ ์์
ViewController๊ฐ ์์ Label์ ์์
์ ์ํฉ์ retain count๋ฅผ ๊ณ์ฐํด๋ณด๋ฉด
someView: 1
Label: 2
๊ฐ ๋ฉ๋๋ค. ์ด ์ํฉ์์ ViewController๊ฐ dealloc ๋๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ผ someView์ retain count๋ ์ด๊ฒ์ ์ฐธ์กฐํ๋ View Controller๊ฐ ์ฌ๋ผ์ ธ -1์ด ๋์ด 0์ด ๋ฉ๋๋ค. ๋ Label ์ญ์ ViewController์ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ ธ -1์ด ๋๊ณ , ์ฌ๊ธฐ์ SomeView์ ์ฐธ์กฐ ์ญ์ ์ฌ๋ผ์ง๋ฏ๋ก -2๊ฐ ๋์ด 0์ด ๋ฉ๋๋ค. Strongํด๋ ์ ํ ๋ฌธ์ ๊ฐ ์๋ ๊ตฌ์กฐ์ ๋๋ค.
๋ง์ฝ ๋ณต์กํ View Hierarchy์์ ํน์ subView๊ฐ ๋ค๋ฅธ subView2๋ฅผ ๊ฐ์ง ๋ subView๊ฐ ์๋์น ์๊ฒ ํด์ ๋ ๊ฒฝ์ฐ subView2๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง๊ฒ ๋ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ Strongํ ์ ์ธ์ด ํ์ํ์ฃ .
๊ทธ๋ผ ํญ์ Strong์ ์ฌ์ฉํด๋ ๊ด์ฐฎ์๊น์? ๋น์ฐํ ์๋๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ViewController์ ๋ฉ์๋์ธ didReceiveMemoryWarning์ด ํธ์ถ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก didReceiveMemoryWarning์์ mainView๋ฅผ nil๋ก ์ฒ๋ฆฌํด์ mainView์ ํฌํจ๋ ๋ชจ๋ Sub View๋ค์ deallocํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ ๊ฒ์ด์ฃ .
์ด ๊ฒฝ์ฐ์ ๋ง์ฝ IBOutlet์ด Strongํ Subview๋ค์ ๊ฐ๊ณ ์๋ค๋ฉด ๊ทธ SubView๋ค์ Reference Count๊ฐ 1 ์ดํ๋ก ์ ๋ ๋ด๋ ค๊ฐ์ง ์์ต๋๋ค. ์ฆ SuperView๊ฐ nil์ด ๋๋ SubView๋ dealloc๋์ง ์์ต๋๋ค. ์๋ํ์ง ์๋ ๋ทฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํ๊ฒ ๋๋ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค.
๐ง outlet ์์ด UI element๋ฅผ ์ฐ๊ฒฐํ ์ ์์๊น?
๊ฐ๋ฅํฉ๋๋ค! ๊ท์ฐฎ๊ธด ํ์ง๋ง viewWithTag(_:)๋ผ๋ ๋ฉ์๋๋ฅผ ํตํด ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค.
๐ง View Controller Hierarchy(๊ณ์ธต ๊ตฌ์กฐ)
view controller๋ tree์ ๊ฐ์ ๊ตฌ์กฐ์ ๊ณ์ธต์ ๊ฐ์ง๋๋ค. ๋ชจ๋ iOS ์ฑ๋ค์ main window๊ฐ ์๊ณ , ๋ชจ๋ window๋ root view controller๋ฅผ ๊ฐ์ง๋๋ค. ์ด view controller๊ฐ app window์ ์ต์ด ํ๋ฉด์ด ๋ฉ๋๋ค. ํ๋์ ์ฑ์ ํ๋ ์ด์์ window๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. Window ๊ทธ ์์ฒด๋ ์๊ฐ์ ์ธ ์์๋ฅผ ๊ฐ์ง ์ ์๊ณ , view controller์ view๊ฐ app์ UI ์์๋ค์ ์ ๊ณตํฉ๋๋ค.
AppDelegate์ ๋ฉ์๋๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
class AppDelegate: UIResponder, UIApplicationDelegate { var window:UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let mainViewController = MainViewController() mainViewController.title = "Main" let frame = UIScreen.main.bounds window = UIWindow(frame: frame) window!.rootViewController = mainViewController window!.makeKeyAndVisible() return true } }
์์ ์ฝ๋๋ app์ ์์์ ์ด ๋ฉ๋๋ค. ์ด ์์์ ์์ ์ต์ด์ ViewController ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ UIWindow ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฉ์๋๋ฅผ ํตํด ๊ทธ ์๋์ฐ์ view controller ๊ฐ์ฒด๋ฅผ ๋ถ์ฌํ๊ณ makeKeyAndVisible ๋ฉ์๋๋ฅผ ํตํด ํด๋น View๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค.
๐ง Storyboard๋ก UI๋ฅผ ๊ทธ๋ฆด ๋ ํ๋ฒ๋ ์ด๋ฐ ์์ ์ ํด์ค ์ ์ด ์๋๋ฐ?!
์ฐ๋ฆฌ๋ ์ฌ์ค ์ด ์์ ์ Storyboard์์ ํ๋ฉด์ ๋ง๋ค ๋๋ง๋ค ํ๊ณ ์์์ต๋๋ค. "Is Initial View Controller" ์ ํ์ ํ๋ฉด ์๋์ผ๋ก ์์ ๋ก์ง์ ์คํ์์ผ ์ค๋๋ค.
๋๋ถ๋ถ์ ์ฑ๋ค์ UITabBarController, UINavigationController, UISplitViewController, UIPageViewController์ ๊ฐ์ "container view controller" ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ view controller๋ค์ ๋ง์ view controller๋ค์ ๊ด๋ฆฌ๊ฐ๋ฅํ ์ธํฐํ์ด์ค์ ์์๋ก์ ๊ด๋ฆฌํฉ๋๋ค.
๐จ๐ผโโ๏ธ View Controller Life Cycle
์ด๋ฒ์ View Controller์ Life Cycle์ ๋ํด ์ด์ผ๊ธฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. App์ Life Cycle์ด ์๋ View์ Life Cycle์ ๋๋ค!
view controller์ ์๋ช ์ ๋น์ฐํ ์ด๊ธฐํ ์์ ์ ์์๋ฉ๋๋ค. view controller ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉฐ view์ ํ๋กํผํฐ์ธ content view๊ฐ ์์ฑ๋ฉ๋๋ค(์์ ์ธ๊ธํ storyboard๋ XIB์ ํํ). ์ด๋ ๊ฒ view๊น์ง ์์ฑ๋๊ณ ๋๋ฉด viewDidLoad ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด viewDidLoad๋ฉ์๋๋ ์ต์ด ํ๋ฒ๋ง ์คํ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด viewDidLoad๋ ์ ์ด์ UIViewController์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๊ตฌํํ๋ ๋ฉ์๋๋ override function์ด ๋์ด์ผ ํฉ๋๋ค. ์ง์ ๊ตฌํํ๋ view controller๋ ์ด UIViewController๋ฅผ ์์ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ์์ ์์ outlet๋ค์ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก viewDidLoad๋ view๋ฅผ ๊ตฌํํ ๋ ์ต์ด์ ํฌ์ธํธ๊ฐ ๋๊ณ ์ด ๊ณณ์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ค์ ๊ตฌํํฉ๋๋ค.
๐ง view controller ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉด ๋ฐ๋ก viewDidLoad๊ฐ ์คํ๋๋ ๊ฒ์ธ๊ฐ?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์๋๋๋ค. view controller์ ์ด๊ธฐํ ์ฆ์ ๋ฉ์๋๊ฐ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ lazyํ๊ฒ ์ ์ธ๋์ด view property์ ์ฒ์ ์ ๊ทผ์ด ์ผ์ด๋ฌ์ ๊ฒฝ์ฐ ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค.
์ด๋ ๊ฒ viewDidLoad๊ฐ ์คํ๋๊ณ ๋๋ฉด view controller๋ Appear/Disappear์ ์ํ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ ์ ๋ฐ๋ผ will/Did์ ์ํ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
Will Did Appear viewWillAppear(_:) viewDidAppear(_:) Disappear viewWillDisappear(_:) viewDidDisappear(_:)
์์ ๊ทธ๋ฆผ๊ณผ ํ๋ฅผ ๋น๊ตํด๋ณด๋ฉด ์์๋ฅผ ์ดํดํ๊ธฐ ๋ ํธํฉ๋๋ค. ๋น์ฐํ view๊ฐ ๋ํ๋๊ธฐ ์ ์ viewWillAppear๊ฐ ๋์ํ๊ณ , ๋ํ๋๋ฉด viewDidAppear๊ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ view๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋ฉด viewWillDisappear๊ฐ ํธ์ถ๋๊ณ ์ฌ๋ผ์ง๋ฉด viewDidDisappear๊ฐ ํธ์ถ๋ฉ๋๋ค. ๋ค์ด๋ฐ์ ์ค์์ฑ์ ์์ผ ๋๋ผ๊ฒ ๋ฉ๋๋ค :)
๊ฐ ๋ฉ์๋๋ค์ ํ๋ผ๋ฏธํฐ๋ก animated of type Bool์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ์ฆ view์ ์๋ช (?)๋ณํ๊ฐ ์ผ์ด๋ ๋ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ค ๊ฒ์ธ์ง์ ๋ํ ์ต์ ์ ๋๋ค. ์ด๋ฌํ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ๋จ์ํ override๋ ๋ฉ์๋๋ง ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ ์์ ํด๋์ค(UIViewController)์ ์ด๋ฏธ ์ ์ธ๋์ด์๋ ๋ฉ์๋, ์ฆ super.method()๋ฅผ ๋จผ์ ํธ์ถํ๊ฒ ๋ฉ๋๋ค.
๐ ์ด๋ฌํ lifecycle function๋ค์ view๊ฐ ๋์์ ์ฌ๋ผ์ง ๋ ์๋ํ๋ค?
์ผ๋ฐ์ ์ผ๋ก ํ๊ธฐ ์ฌ์ด ์คํด๋ก ์๋ฐํ ์ ์ํ๋ฉด ์ฌ์ค์ด ์๋๋๋ค. ์ด๋ฌํ ๋ฉ์๋๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก view controller์ content view๊ฐ view hierarchy์์ ์ถ๊ฐ๋๊ฑฐ๋ ์ฌ๋ผ์ง์ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค.
์์ ์๋ฃ๋ค์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ๋ฉ์๋์ ์์ฑํด์ผํ ๋ด์ฉ๋ค์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
viewDidLoad: view controller์ ์ง์ ํฌ์ธํธ
viewWillAppear: viewController์ content view๊ฐ view hierarchy์ ์ถ๊ฐ๋๊ธฐ ์ ๋์. viewController๊ฐ ํ๋ฉด์ ๋ณด์ด๊ธฐ ์ง์ ์ผ์ด๋์ผํ๋ ๋จ์ ์ฐ์ฐ
viewDidAppear: viewController์ content view๊ฐ view hierarchy์ ์ถ๊ฐ๋ ํ ๋์. ํ๋ฉด์ด ๋ํ๋จ๊ณผ ๋์์ ์์๋์ผํ ์ฐ์ฐ(e.g. ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ)
viewWillDisappear: viewController์ content view๊ฐ view hierarchy์ ์ญ์ ๋๊ธฐ ์ ๋์. ํค๋ณด๋๋ฅผ ์จ๊ธฐ๊ฑฐ๋ ํน์ ์์ ์ ์ ์ฅํ๋ ๋ฑ ํ๋ฉด์ด ์ฌ๋ผ์ง๊ธฐ ์ ๋์ํด์ผํ ์์
viewDidDisappear: viewController์ content view๊ฐ view hierarchy์ ์ญ์ ๋ ํ ๋์. ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ์ถํ ์ฌ์์ฑ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ์ ๊ฑฐ ๋ฑ ๋ง๋ฌด๋ฆฌ ์์
์์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
viewDidLoad: on-screen messageLabel์ ํํ๋ ๋ฌธ์ ํ๋กํผํฐ ์ธํ
viewWillAppear: ๋ฐฑ์๋์์ ๋ณ๊ฒฝ๋ ์๋ก์ด UI ์ ๋ณด ์ ๋ฐ์ดํธ
viewDidAppear: ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ LoginViewController ๋์ฐ๊ธฐ
viewWillDisappear: ๋ณ๊ฒฝ์ฌํญ db ์ ์ฅ
viewDidDisappear: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ(tear down view controller)
Reference: https://learnappmaking.com/view-controller-uiviewcontroller-ios-swift/
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_01 (0) | 2021.10.17 |
---|---|
[iOS] - Texture ์ค์นํ๊ธฐ (0) | 2021.08.20 |
[iOS] - ์ ๋ ํ ์คํธ(Unit Tests) (0) | 2021.05.12 |
[iOS] - UIBarButton Style(Bar ๋ฒํผ ์คํ์ผ) (0) | 2021.05.04 |
[iOS] - {Function(ํจ์) or Method(๋ฉ์๋)} vs Computed Property(์ฐ์ฐ ํ๋กํผํฐ) (0) | 2021.04.30 |
- Total
- Today
- Yesterday
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- API#lazy#
- ์์ด์ฌ์ดํด#BOJ#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- django#slicing
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- Distinct#Codility#Python
- django
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ํธ์ฝ๋#dp#BOJ#Python
- Brackets#Stacks and Queues#Codility#Python
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- N์ผ๋ก ํํ#DP#Programmers#Python
- PassingCars#Codility#Python
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- filter#isalnum#lower
- NumberofDiscIntersections#Codility#Sort#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- Swift#Tuples#Range
- Triangle#Sorting#Codility#Python
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |