๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ

2023.10 ๊ธฐ์ค€ SwiftUI์—์„œ life cycle updates modifier๋กœ ์ง€์ •๋œ ๊ฒƒ์€ 4๊ฐœ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋งˆ์ง€๋ง‰ task๋Š” task๋งŒ ๋”ฐ๋กœ ํ•œ๋ฒˆ ํŒŒ๋ณด๊ธฐ๋กœ ํ•˜๊ณ  onAppear, onDisappear, task ์•Œ์•„๋ด…์‹œ๋‹ค ๋‹ค ๋“œ๋ฃจ์™€~ SwiftUI์—์„œ ํ™”๋ฉด์„ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. UIKit์—์„œ ViewController๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ํ™”๋ฉด ์ „ํ™˜๋˜๋Š” View๋ฅผ ViewController๋กœ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ SwiftUI ์—์„œ๋Š” view๋ผ๋Š” ๋‹จ์œ„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๊ธฐ ๋ณด๋‹ค๋Š” View๊ฐ€ View๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ View์˜ ์ผ๋ถ€๋ถ„์ด ๋  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ณ ๋ คํ•ด์„œ ์•Œ์•„๋ด์•ผ ํ•œ๋‹ค. ์šฐ์„  ๊ฐ modifire์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด onAppear func o..
* advanced๊ฐ€ ๊ธ€ ์•ž์— ๋ถ™์œผ๋ฉด ์ด๋ก  + ์‹ค์ „์‘์šฉ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค~ Environment์™€ keypath๋ฅผ ํ†ตํ•ด์„œ SwiftUI์—์„œ ๋ฏธ๋ฆฌ ์ง€์ •๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. @Environment(\.layoutDirection) var layoutDirection @Environment(\.dismiss) var dismiss ๊ฐ๊ฐ View์˜ ๋ฐฉํ–ฅ, ๋ทฐ๋ฅผ dismiss ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’์„ Environment ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ํ†ตํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ ์ง์ ‘ ์ปค์Šคํ…€๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. Environment์™€ EnvironmentObject๋Š” ์—ฌ๋Ÿฌ View์— ๊ฑธ์ณ์„œ ์‚ฌ์šฉํ•  ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ์˜ค๋Š˜์€ ๊ทธ ์ค‘์—์„œ Environment ์•Œ์•„๋ณด๊ธฐ! Environment Values Environmen..
predicates๋Š” ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋ฉด ์ˆ ์–ด๋ผ๊ณ  ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” ๋…ผ๋ฆฌ์ ์ธ ์กฐ๊ฑด์‹์„ ์˜๋ฏธํ•จ. SwiftData๋Š” predicates๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๋…ผ๋ฆฌ์  ์กฐ๊ฑด์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค. SwiftData์˜ Schema๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด Model์„ ๊ตฌ์„ฑํ•  ๋•Œ enum ์ด๋‚˜ image ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ. Relationship ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ˜ผ์ž ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋Š” ์—†๊ณ , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ทธ ๊ด€๊ณ„๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ๋‹ค:๋‹ค ๊ด€๊ณ„ A๋ผ๋Š” ๋ชจ๋ธ์ด B๋ชจ๋ธ์„ ์—ฌ๋Ÿฌ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , B๋ผ๋Š” ๋ชจ๋ธ์ด A๋ผ๋Š” ๋ชจ๋ธ์„ ์—ฌ๋Ÿฌ๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„๋•Œ ๋‹ค:๋‹ค ๊ด€๊ณ„๋ผ๊ณ  ํ•œ๋‹ค. /// ์œ ์ € ์ •๋ณด @Model class ..
๋ฆฌ์ŠคํŠธ๋Š” ์„œ๋น„์Šค ๋˜๊ณ  ์žˆ๋Š” ์•ฑ์—์„œ ๋น ์ง€์ง€ ์•Š๊ณ  ๋“ฑ์žฅํ•˜๋Š” UI ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ผ๋ถ€๋งŒ ๊ฐ€์ ธ์˜จ ๋’ค ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์ผ๋ถ€๋ฅผ ๋‹ค ๋ณด๋ฉด ์ƒˆ๋กœ์šด ๋ชฉ๋ก์„ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ load more ํ˜น์€ infinite scroll ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. SwiftUI์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ View๋“ค์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘์— VStack์€ ์•„์ดํ…œ๋“ค์„ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์Œ“์Šต๋‹ˆ๋‹ค. ์ด VStack์ด ScrollView์™€ ๋งŒ๋‚˜๋ฉด ์ €ํฌ๊ฐ€ UIKit์—์„œ ๋ณด์•˜๋˜ UITableView ํ˜น์€ UICollectionView์™€ ๋™์ผํ•œ UI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์— LazyVStack์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค! ๊ฐ์ž ์–ด๋””์— ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ์š”? ์ฐจ์ด์ ๊ณผ ๊ฐ๊ฐ ๋™์ž‘ํ•˜๋Š” ..
๋ช‡ ๋…„ ๋™์•ˆ ํ•œ ์ฃผ์— 2๋ฒˆ ์ •๋„ ํ•˜๋˜ ์ง€์ธ๋“ค๊ณผ์˜ ํšŒ๊ณ  ๋ชจ์ž„์ด ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์— ์ด์ง์„ ํ•˜๋ฉด์„œ ๊ธฐ๋ก์˜ ์ค‘์š”์„ฑ์„ ๋Š๊ผˆ์–ด์š”. ๊ธฐ๋ก์ด ์—†์œผ๋ฉด ๊ทธ์ € ์ƒ๊ฐ ์†์—์„œ ์Šค์ณ ์ง€๋‚˜๊ฐ€๋ฒ„๋ฆฌ๋”๋ผ๊ตฌ์š”. ์ œ๊ฐ€ ๊ณผ๊ฑฐ์— ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ์–ผ๋งˆ๋‚˜ ์„ฑ์žฅํ–ˆ๋Š”์ง€ ์•Œ๊ณ  ์•Œ๋ฆด๋ ค๋ฉด ๊ธฐ๋ก์„ ํ•ด์•ผ ๊ฒ ๊ตฌ๋‚˜ ์‹ถ๋”๋ผ๊ตฌ์š”. ํšŒ์‚ฌ์—์„œ ๋งค์ฃผ ํšŒ๊ณ  ๋ชจ์ž„์„ ์ง„ํ–‰ํ•˜๋‹ˆ ๋” ์ด์ƒ์˜ ํšŒ๊ณ  ๋ชจ์ž„ ๊ฐ€์ž…์€ ๊ทธ๋งŒ ๋‘๊ณ  ์Šค์Šค๋กœ ํฌ์ŠคํŒ… ํ•˜๋ฉฐ ๋˜๋Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค! (์ง€๊ธˆ ์ด ์‹œ์ ์—๋„ ๋‹ค๋ฅธ ๋ชจ์ž„ ํ•˜๋‚˜๋ฅผ ์ถ”์ฒœ ๋ฐ›์•˜๋Š”๋ฐ ํ• ๊นŒ ๋ง๊นŒ ์ •๋ง ๊ณ ๋ฏผ์ด์ž…๋‹ˆ๋‹นใ… ใ…  ๋‹ค๋ฅธ ๋ถ„์•ผ ์‚ฌ๋žŒ๋“ค ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ํ”์น˜ ์•Š์•„์„œ..) ์ƒ๊ฐ๋ณด๋‹ค TMI๋ผ ์•„๋ฌด๋„ ์•ˆ ์ฝ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฝ๊ณ  ํ”ผ๋“œ๋ฐฑ ํ•ด์ค€๋‹ค๋ฉด ํ–‰๋ณตํ•  ๊ฒƒ ๊ฐ™์€.. ์šฐ์„  ์ ์–ด๋ด…๋‹ˆ๋‹น .. ๐Ÿฎ Q1 (1 ~ 3์›”) ํ”„๋กœ์ ํŠธ์˜ ์—ฐ์† ์ž‘๋…„ 22๋…„ 6..
๋„ค๋น„๊ฒŒ์ด์…˜์€ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฐ๊ณผ ๋ทฐ ์‚ฌ์ด๋ฅผ ์ด๋™ํ•˜๊ณ  ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ UINavigationController์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ navigationStack์„ ๊ด€๋ฆฌํ•˜๋ฉฐ NavigationBar ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ™”๋ฉด๊ฐ„ ์ด๋™์„ ์ง€์› NavigationView๋Š” iOS ๊ธฐ์ค€ 13.0 ~ 17.0 ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋ฉฐ deprecated ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— iOS 16.0 ๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด NavigationStack์„ ์‚ฌ์šฉ NavigationLink NavigationStack, NavigationSplitView ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ NavigationView์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ struct NavigationLink where Label : View, Destination : View label์€ ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ทฐ๋กœ์„œ Navi..
Background Problems ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋Š” NavigationView๋‚˜ NavigationStack์ด ์—†๋‹ค. ํ™”๋ฉด ์ด๋™์„ ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ์ด๋™ ํ•  View๋ฅผ ZStack์„ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ์กด ๋ทฐ ์œ„์— ๋ฎ์–ด ์”Œ์šฐ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์— navigation push ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๊ณ  ๋“ค์–ด์˜ค๋Š” ๋“ฏํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค. ๋ฉ”์ธ์—๋Š” ํƒญ๋ทฐ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ ํƒญ์—๋Š” rootView๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” View๊ฐ€ ์กด์žฌํ•œ๋‹ค. rootView์—์„œ ์ƒ์„ธ๋กœ ์ด๋™ํ•˜๋ฉด ์ด ์ƒ์„ธ ํ™”๋ฉด์€ ํƒญ๋ฐ”๋ฅผ ๊ฐ€๋ฆฌ๋ฉด์„œ ํ™”๋ฉด ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ํƒญ๋ทฐ๊ฐ€ ๋ณด์ด์ง€ ์•Š์•„์•ผ ํ•˜๋ฏ€๋กœ window์—์„œ UITabBar์„ ์ฐพ๊ณ  window ์ „์ฒด offset์„ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ํƒญ๋ทฐ๋ฅผ ๊ฐ€๋ฆฌ๊ณ  ๋ณด์ด๊ฒŒ ..
๋™์ผํ•œ UI ๊ตฌ์„ฑ์„ ๊ฐ€์ง€์ง€๋งŒ ๊ฐ€๋กœ๋ชจ๋“œ์—์„œ ์„ธ๋กœ๋ชจ๋“œ๋กœ ๋ณ€๊ฒฝ๋ ๋•Œ ํ™”๋ฉด์˜ ๋„“์ด๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • UI์—์„œ๋Š” ํ™”๋ฉด์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด์„œ ์ด์— ๋Œ€์‘ํ•ด์•ผ ํ•ด์š”. ViewBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ๋Œ€์‘ ๊ฐ€๋Šฅํ•œ View๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ˜น์‹œ ViewBuilder๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜์„ธ์š”! [SwiftUI] ViewBuilder ์•Œ์•„๋ณด๊ธฐ Definition @resultBuilder struct ViewBuilder ํด๋กœ์ €์—์„œ ๋ทฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ๋ผ๋ฏธํ„ฐ ์†์„ฑ func contextMenu( @ViewBuilder menuItems: () -> MenuItems ) -> some View ํด๋กœ์ € ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด child view๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž framios.tis..
fram
'๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (4 Page)