๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

iOS/TIL

22.07.21 ใ…ฃ ViewController Transition(ํ™”๋ฉด์ „ํ™˜) & Optional Binding(์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ) & ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ vs ํƒ€์ž… ํ”„๋กœํผํ‹ฐ

 

 

 

ViewController Transition

 

- Present - Dismiss (a.k.a Modal)

 

Present - Dismiss ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” ์ƒ์—์„œ๋Š” Modal ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ™”๋ฉด์ „ํ™˜ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์—์„œ ์œ„, ์œ„์—์„œ ์•„๋ž˜๋กœ ํ™”๋ฉด์ „ํ™˜์ด ์ผ์–ด๋‚œ๋‹ค๊ณ  ์˜ˆ์ธกํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ๊ทธ ์ค‘์—์„œ Present๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค. 

 

 

์šฐ์„  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ง€์ ์€ ์œ„ ์ฝ”๋“œ์—์„œ ์ฃผ์„์„ ๋‹จ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ์ž…๋‹ˆ๋‹ค. 2.5๋ฒˆ๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„์€ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜์ง€๋งŒ, ํ™”๋ฉด์ „ํ™˜์„ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ์„ ์ ์–ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” present ๋ฐฉ์‹์˜ style๋ฅผ fullscreen์œผ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ „ํ™˜๋œ ํ™”๋ฉด์—”๋Š” ํ™”๋ฉด์„ ๋‹ซ์„ ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์ด ์—†์œผ๋ฏ€๋กœ bar button item์„ ํ™œ์šฉํ•ด์„œ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์„ ๊ตฌํ˜„ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด NavigationController์„ ์ž„๋ฒ ๋””๋“œ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๋‹ค์Œ์€ Dismiss ๊ตฌํ˜„๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์˜ selector๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•ด, ๋”ฐ๋กœ closeButtonClicked()๋ผ๋Š” ๋ฉ”์„œ๋“œ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. Dismiss๋Š” Present์— ๋น„ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. 

 

 

 

- Push - Pop (a.k.a Show)

 

Push - Pop์€ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์ƒ์—์„œ Show๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ™”๋ฉด์ „ํ™˜ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ™”๋ฉด์ „ํ™˜์ด ์ขŒ์šฐ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ๊ฑธ ์˜ˆ์ธกํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Push - Pop ๊ณผ Present - Dismiss ์˜ ๊ตฌํ˜„ ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋‹ค๋ฅธ ์ ์ด๋ผ ํ•˜๋ฉด, Push - Pop ์€ ๋ฐ˜๋“œ์‹œ NavigationController ๊ฐ€ ์ž„๋ฒ ๋“œ ๋˜์–ด ์žˆ์–ด์•ผ ํ™”๋ฉด ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

 

๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„ ๋ฐฉ์‹์€ ๋น„์Šทํ•˜๋‚˜, 3๋ฒˆ ๋ถ€๋ถ„์ด ์ž‘์„ฑ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3๋ฒˆ ์ฝ”๋“œ์—์„œ NavigationController๊ฐ€ ์ œ๋Œ€๋กœ ์ž„๋ฒ ๋“œ ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด, ์˜ต์…”๋„์ฒด์ด๋‹์œผ๋กœ ์ธํ•ด Nil์ด ๋ฐœ์ƒํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋‹ˆ ๋ฐ˜๋“œ์‹œ ๋ฃจํŠธ๋ทฐ๊ฐ€ NavigationController์— ์ œ๋Œ€๋กœ ์ž„๋ฒ ๋“œ ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

@IBAction func closeButtonClicked(_ sender: UIButton) {
	navigationController?.popViewController(animated: true)
}

 

Pop์˜ ๊ฒฝ์šฐ๋„ Dismiss์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. 

 

 

 

Optional Binding(์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ)

 

์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์ด๋ž€ ์˜ต์…”๋„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์˜ต์…”๋„์„ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•์ œ ํ•ด์ œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์˜ต์…”๋„์ด Nil๊ฐ’์„ ๊ฐ€์งˆ ๋•Œ crash ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

 

 

์›๋ž˜ Optional String ํƒ€์ž…์ด์—ˆ๋˜ kate ์™€ jacob์„ she ์™€ him ์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜(Type: String)์— ์ €์žฅํ•จ์œผ๋กœ์จ, ์•ˆ์ „ํ•˜๊ฒŒ Optional์„ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  else ๊ตฌ๋ฌธ์œผ๋กœ Optional์ด Nil๊ฐ’์„ ๊ฐ€์งˆ ๋•Œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. 

 

 

๋‹ค์Œ์€ ์œ„์˜ ์˜ˆ์‹œ์™€ ๋™์ผํ•˜๊ฒŒ guard ๊ตฌ๋ฌธ์œผ๋กœ Optinal ์„ ์ฒ˜๋ฆฌํ•ด์ค€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. guard์˜ ๊ฒฝ์šฐ optional์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ Nil ๊ฐ’์ด ๋‚˜์˜ค๋ฉด else ๊ตฌ๋ฌธ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๋๋‚œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์กฐ๊ฑด๋ฌธ์ด๋ž‘์€ ์กฐ๊ธˆ ๋‹ฌ๋ผ์„œ, guard์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์Šค์ฝ”ํ”„ ๋ฐ”๊นฅ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ vs ํƒ€์ž… ํ”„๋กœํผํ‹ฐ 

 

์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์™€ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ์š”? 

 

 

 

์šฐ์„  ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€์žฅ ์ต์ˆ™ํ•œ ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ๋˜ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ดˆ๊ธฐํ™”ํ•  ๊ณต๊ฐ„์„ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ํƒ€์ž… ๊ทธ ์ž์ฒด๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ™์€ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์ด์ง€๋งŒ, ์ธ์Šคํ„ด์Šค๋กœ ์ ‘๊ทผํ•˜๋Š”๊ฒŒ ์•„๋‹Œ ๊ทธ๋ƒฅ ํƒ€์ž…์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ์š”์†Œ๋กœ์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  ๋”ฐ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.