[SwiftUI] Composing Complex Interfaces
์๋ฌธ: ํํ ๋ฆฌ์ผ ํ์ด์ง
Composing Complex Interfaces
์ด๋ฒ ์ฅ์์๋ ์ฌ๋ฌ ๋ทฐ๋ค์ ํฉ์น ํ๋์ ํ๋ฉด์ ๋ง๋ค์ด๋ณธ๋ค. ์ง๊ธ๊น์ง๋ ์ฌ๋ฌ๊ฐ์ ๋ทฐ๋ฅผ ์ฌ์ฉํ์ง๋ง ์ด๋ฒ ์ฅ์์๋ ์คํฌ๋กค๋ทฐ๋ฅผ ํฉ์น๋ ๊ฒ..! storyboard๋ก ์น๋ฉด tableView ์์ collectionView๊ฐ ์๋ ๋๋์ด๋๊น.
Add a Category View
์ฑ์ ์คํํ์ ๋ ๊ฐ์ฅ ๋จผ์ ๋ณผ ํ๋ฉด์ธ Home ํ๋ฉด์ ์ ์ํ๋ค.
- Home ํ๋ฉด์ด ๋ CategoryHome SwiftUI View ํ์ผ์ ๋ง๋ ๋ค.
- body ๋ด์ NavigationView๋ฅผ ์ถ๊ฐํ๊ณ title์ โFeaturedโ๋ก ์ง์ ํ๋ค.
Create a Category List
์ฌ์ค ์ฐ๋ฆฌ๊ฐ ํํ ๋ฆฌ์ผ ์ฒ์์ ๋ฐ์๋ landmarkData.json ํ์ผ ์์๋ category ์ ๋ณด๋ ํจ๊ป ์์๋๋ฐ, ์์ง ๊ทธ๊ฑด ์ฌ์ฉ์ ์ํด์ Landmark ๊ตฌ์กฐ์ฒด์ ์ถ๊ฐํ์ง ์์์๋ค.
- Landmark ์ฝ๋ ์์
์ด๋ฒ ์น์ ์์ category๋ฅผ ์ถ๊ฐํด ํ์ฑํ ์ ์๋๋ก Landmark ์ฝ๋๋ฅผ ์์ ํ๋ค.
var category: Category
enum Category: String, CaseIterable, Codable {
case lakes = "Lakes"
case rivers = "Rivers"
case mountains = "Mountains"
}
category์๋ lakes, revers, mountains ์ธ ์ข ๋ฅ๊ฐ ์๊ณ json ํ์ฑ์ ์ํด ์ญ์๋ Codable์ ์ฑํํ๋ค. ์ถํ ํ๋ฉด์ ์นดํ ๊ณ ๋ฆฌ ๋ช ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด String enum์ผ๋ก ๋ง๋ค์๋ค.
- categories ํ๋กํผํฐ ์์ฑ ModelData์์๋ category ๋ณ๋ก landmark๋ฅผ ๋ถ๋ฅํ ์ ์๋๋ก [String: [Landmark]] ๋์ ๋๋ฆฌ๋ฅผ ์์ฑํ๋ค.
Dictionary์์ grouping์ ์ฌ์ฉํ ์ ์๋์ง ๋ชฐ๋๋๋ฐ, ์ด๊ฒ๋ ๋ณ๋ ํฌ์คํ ์ผ๋ก ๋จ๊ฒจ๋ฌ์ผ๊ฒ ๋ค.
- CategoryHome์์ categories ์ ๊ทผํด ๋ ธ์ถํ๋๋ก ์์ ์ด์ ์๊น ๋ง๋ค์ด๋ CategoryHome์ผ๋ก ๋์๊ฐ๋ค.
modeldata์ ์๋ category์ ์ ๊ทผํ๊ธฐ ์ํด @EnvironmentObject var modelData: ModelData
๋ฅผ ์ ์ธํ๋ค. preview์๋ .environmentObject๋ฅผ ์ถ๊ฐํ๋ค.
NavigationView ๋ด๋ถ์ List๋ฅผ ์ถ๊ฐํด category์ key๊ฐ์ ๋ชฉ๋ก์ผ๋ก ๋ ธ์ถ์ํจ๋ค.
Create a Category Row
์ฐ๋ฆฌ๊ฐ CategoryHome์์ ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ๋ง ๋ ธ์ถ์ํจ๋ค๋ฉด ์ด๊ฑด Complex ํ๋ค๊ณ ํ๊ธฐ์ ์กฐ๊ธ ๋ถ์กฑํ๋ค. ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ํ ๋๋๋งํฌ๋ฅผ ์คํฌ๋กค๋ทฐ๋ก ๋ ธ์ถ์ํค๋๋ก ํด๋ณด์.
์๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์ด์ผ ํ๋ Category Row.
Row์ ๋ํ๋์ผํ๋ ๊ฒ์ ์๊ฐํด๋ณด๋ฉด, ์นดํ ๊ณ ๋ฆฌ ๋ช ๊ณผ ๋๋๋งํฌ์ ์ด๋ฏธ์ง, ์ด๋ฆ ์ ๋๊ฐ ์๋ค. ๋๋๋งํฌ์ ์ด๋ฏธ์ง์ ์ด๋ฆ์ VStack์ผ๋ก, ์ด VStack๊ณผ ์นดํ ๊ณ ๋ฆฌ ๋ช ์ ๋ค์ VStack์ผ๋ก ๋ฌถ์ด์ผ ํ ๊ฒ๋ง ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ข์ฐ๋ก ์คํฌ๋กค์ด ๊ฐ๋ฅํ๋๋ก ๋๋๋งํฌ์ ์ด๋ฏธ์ง์ ์ด๋ฆ์ด ๋ฌถ์ธ VStack์ ScrollView๋ก ๋ฌถ์ด๋ณด์.
- CategoryItem ๋ง๋ค๊ธฐ
๋๋๋งํฌ์ ์ด๋ฏธ์ง์ ์ด๋ฆ์ ๋ฌถ์ด์ ๋ณด์ฌ์ฃผ๋ CategoryItem์ ๋ง๋ค์ด๋ณธ๋ค.
Item์ ์์ฑํ ๋ ํ์ํ landmark๋ฅผ ํ๋กํผํฐ๋ก ์ ์ธํ๊ณ VStack ๋ด๋ถ์ ๋๋๋งํฌ์ ์ด๋ฏธ์ง์ ์ด๋ฆ์ ๋ฃ์ด์ฃผ์๋ค. ์ ์ ๊ฐ๊ฒฉ์ ์ํด padding ๊ฐ๋ ์ ์ฉํ๋ค.
- CategoryRow ๋ง๋ค๊ธฐ
ScrollView ๋ด๋ถ์์ RowItem์ ๊ฐ๋ก๋ก ๋ฌถ์ด์ ๋ณด์ฌ์ฃผ๋๋ก HStack์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ScrollView์ ์นดํ ๊ณ ๋ฆฌ ๋ช ์ VStack์ผ๋ก ๋ฌถ์ด์ฃผ์๋ค.
Complete the Category View
์ด์ ๋ค์ CategoryHome์ผ๋ก ๋์๊ฐ์ ๋ฉ์ธํ๋ฉด ์์ ์ ๋ง๋ฌด๋ฆฌํด๋ณด์.
ํ์ฌ๋ List ๋ด๋ถ์ ์นดํ
๊ณ ๋ฆฌ ๋ช
๋ง ๋
ธ์ถ๋๊ณ ์์ง๋ง ์ด ๋ถ๋ถ์ ์๊น ๋ง๋ CategoryRow๋ฅผ ๋
ธ์ถํ ์ ์๋๋ก ์์ ํ๋ค.
๊ธฐ์กด์ Text๋ก๋ง ์ถ๋ ฅ๋๋ ๋ถ๋ถ์ CategoryRow(categoryName: key, items: modelData.categories[key]!)
๋ก ๋ณ๊ฒฝํ์. ์๋์ ๊ฐ์ด ๋ฐ๋๋ค.
๊ฐ์ฅ ์์๋ featured ๋๋๋งํฌ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ๋ค..! List ์์ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๊ฐ์ผ ํ๋๋ฐ ๋๋๊ฒ๋ json ํ์ผ์ isFeatured ๊ฐ์ด ์๋ค..?
์ฐ์ Landmark ๊ตฌ์กฐ์ฒด์ ๊ฐ์ ์ถ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ModelData์์ ์ฐ๋ฆฌ๊ฐ ํ๋ฉด ๋ ธ์ถ์ ์ฌ์ฉํ ์ ์๋๋ก features: [Landmark] ๋ฐฐ์ด์ ๋ง๋ ๋ค.
var features: [Landmark] {
landmarks.filter { $0.isFeatured }
}
๊ทธ๋ฆฌ๊ณ ๋ค์ CategoryHome์ผ๋ก ๋์๊ฐ์ List์ ๊ฐ์ฅ ์์ featured์ ์ฒซ๋ฒ์งธ ์ด๋ฏธ์ง๊ฐ ๋์ค๋๋ก ์์ ํ๋ฉดโฆ!
์๋ ๊ฒ ์ํ๋ ํ๋ฉด์ด ์์ฑ๋๋ค ๐
.listRowInsets(EdgeInsets())๋ฅผ ์ฌ์ฉํ๋ฉด List์ Row๋ค์ด ๊ฝ ์ฐจ๊ฒ ๋์จ๋ค. (edge inset 0)
Add Navigation Between Sections
Home ํ๋ฉด๋ ์์ฑ๋์์ผ๋ ์ด์ Home๊ณผ Detail ํ๋ฉด์ ์ฐ๊ฒฐํด ํ๋ฉด ์ด๋์ ํด๋ณด์.
-
CategoryRow์ navigation link ์ถ๊ฐ ๊ฐ CategoryItem์ ๋๋ฅด๋ฉด ์ด๋ํ ์ ์๋๋ก NavigationLink๋ฅผ ์ถ๊ฐํด์ค๋ค.
-
tab ์ ์์ฑํด ๋ฆฌ์คํธ ํ๋ฉด๊ณผ ๋ฉ์ธํ๋ฉด์ ์ด๋ํ ์ ์๋๋ก ์์
@State private var selection: Tab = .featured
enum Tab {
case featured
case list
}
ContentView์ ํญ์ด๋์ ํ์ํ ๊ฐ์ธ Tab enum์ ์ถ๊ฐํ๋ค. ๊ธฐ๋ณธ ๊ฐ์ .featured๋ก ์ค์ ํ๋ค.
ํ์ฌ ContentView์๋ List๋ฅผ ๋
ธ์ถํ๋๋ก body์ ์ค์ ๋์ด ์์ผ๋ฏ๋ก TabView
๋ฅผ ์ถ๊ฐํด ํญ์ ์ด๋ํ ์ ์๋๋ก ์์ ํ์.
TabView(selection: $selection) {
CategoryHome()
.tag(Tab.featured)
LandmarkList()
.tag(Tab.list)
}
์ฌ๊ธฐ๊น์ง๋ง ํ๋ฉด ์๋ ํญ๋ทฐ๋ง ์์ฑ์ด ๋๊ณ ์ด๋์ ์๋๋ ํ๋ฉด์ด ๋๋ค. tabItem์ ์ค์ ํด ํญ๋ทฐ์ ์์ด์ฝ์ด ๋ ธ์ถ๋ ์ ์๋๋ก ํ๋ค.
As Is | Te Be |
---|---|
ํ๋ฆฌ๋ทฐ๋ฅผ ์คํ์์ผ ์๋ํด๋ณด์. ๋ํ ์ผ๋ทฐ๋ก, ํญ์ด๋๋ ์๋๋์ง ๋ชจ๋ ํ์ธ..!
๋ง๋ฌด๋ฆฌ
SwiftUI๊ฐ ์ฒ์ ๋์ ๋๊ณ ๋์๋ ์์ํด์ ๋ชป ์ธ ๊ฒ ๊ฐ์๋๋ฐ ์ด๋ ๊ฒ ํํ ๋ฆฌ์ผ๋ก ๋๋ ค๋ณด๋๊น ์๊ฐ๋ณด๋ค ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค. ์์ง์ ์ ์์ด ์๋๊ธฐ๋ ํ๊ณ ์ง์ํ๋ ๋ฉ์๋ ๊ฐ์๊ฑธ ์์ธํ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ฐ๋๋ฐ ์ค๋ ๊ฑธ๋ฆฌ์ง๋ง ์ด๊ฒ๋ ์ ์ํ๋ฉด ์ถฉ๋ถํโฆ.? ์คํ๋ ค ์ฝ๋๋ก ์ง์ ๋ ์ข์ ๊ฒ ๊ฐ๋ค. ๋ทฐ๊ฐ ๋ณต์กํด์ง๋ฉด ํ์ผ ๋ถ๋ฆฌ๋ฅผ ์ ํด์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์์ง ์๋๋ก ํ๋ ๊ฒ ์ค์ํด์ง์ง ์์๊น?
Leave a comment