# ์คํ 1: Toggle View ๊ตฌํํ๊ธฐ ## ๐ Todo ### ToggleView์ ํ์ผ์ View๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง๋ฅผ ๋ถ์ํด๋ด ์๋ค. - ToggleView.swift - isStateToggleOn ํ๋กํผํฐ(Bool) - body(View) - ZStack - RoundedRectangle - VStack - Text - Toggle ### stateToggle ์ ๋๋ฅผ ๋ View์๋ ์ด๋ค ๋ณํ๊ฐ ์์๊น์? - isStateToggleOn์ ๊ฐ์ด ๋ฐ๋๋๋ค. - View ์ ์ฒด๊ฐ ๋ค์ ๊ทธ๋ ค์ง๋๋ค. ### stateToggle ํ ๊ธ ์ค์์น๊ฐ ์ผ์ ธ์์ผ๋ฉด Text์ State On ์ด, ํ ๊ธ ์ค์์น๊ฐ ๊บผ์ ธ์์ผ๋ฉด Text์ State Off ๊ฐ ๋ํ๋๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์? ```swift VStack { isStateToggleOn ? Text("State On") : Text("State Off") // Text(isStateToggleOn ? "State On" : "State Off") (...) } ``` ### State PropertyWrapper๋ View์์ ์ด๋ค ์ญํ ์ ํ ๊น์? > A property wrapper type that can read and write a value managed by SwiftUI. - @State๋ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์์ ๋จ์ผ ๋ทฐ์ ๊ฐ์ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค. - ๋ทฐ ๋ด๋ถ์ ๊ฐ์ ์ ์ฅํ๊ณ ๊ทธ ๊ฐ์ ๋ณํ๋ฅผ ์ถ์ ํ์ฌ ๋ทฐ๋ฅผ ๋ค์ ๊ทธ๋ฆด ์ ์๋๋ก ํฉ๋๋ค. - ์์ ๋ทฐ๊ฐ ์๋ค๋ฉด ๋ถ๋ชจ ๋ทฐ์์ @State๊ฐ ๋ถ์ ๊ฐ์ ๋ณํ๊ฐ ์๊ธธ ๊ฒฝ์ฐ ์์ ๋ทฐ๋ ์ ๋ฐ์ดํธ์ํต๋๋ค. ๋จ ์์ ๋ทฐ์์ ์ง์ ๋ถ๋ชจ ๋ทฐ์ ํ๋กํผํฐ ๊ฐ์ ๋ณํ์ํฌ ์๋ ์์ต๋๋ค. # ์คํ 2: ToggleView ๋ค ๊ฐ๋ฅผ ์กฐํฉํด ContentView ์์ฑ ## ๐ Todo ### ContentView ํ์ผ์์ ํ์ View๋ฅผ ์กฐํฉํด ์ฌ์ง๊ณผ ๊ฐ์ UI๋ฅผ ๋ง๋ค์ด๋ด ์๋ค. Stack , ๋๋LazyVGrid ํ์ฉ ```swift struct ContentView: View { var body: some View { LazyVGrid(columns: [GridItem(), GridItem()]) { ToggleView() ToggleView() ToggleView() ToggleView() } } } ``` # ์คํ 3: ์ฌ๋ฌ ๋ทฐ๊ฐ ๋์์ ๊ด์ฐฐํ๋ Property ์์ฑ ## ๐ Todo ### Model ํด๋์ค ๋ด๋ถ์ ํ๋กํผํฐ๊ฐ ๋ฐ๋์์ ๋, ์ด๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ View๊ฐ ์๋์ ์ผ๋ก ๊ฐฑ์ ๋๊ฒ ํด๋ด ์๋ค. ```swift // Model.swift class Model: ObservableObject { @Published var isEnvironmentStateToggleOn: Bool = false } // ContentView.swift struct ContentView: View { @StateObject private var model = Model() var body: some View { LazyVGrid(columns: [GridItem(), GridItem()]) { ToggleView(model: model) ToggleView(model: model) ToggleView(model: model) ToggleView(model: model) } } } ``` ```swift // ToggleView.swift struct ToggleView: View { @State private var isStateToggleOn: Bool = false @ObservedObject var model: Model var body: some View { ZStack { RoundedRectangle(cornerRadius: 20) .stroke(lineWidth: 2) .foregroundColor(.red) VStack { Text(isStateToggleOn ? "State On" : "State Off") Toggle("State", isOn: $isStateToggleOn) .padding() Toggle("Environment", isOn: $model.isEnvironmentStateToggleOn) .padding() } } .padding() } } struct EnvironmentToggleView_Previews: PreviewProvider { static var previews: some View { ToggleView(model: Model()) } } ``` ### ObservedObject / StateObject EnvironmentObject ์ฐจ์ด์ - `ObservedObject` > A property wrapper type that subscribes to an observable object and invalidates a view whenever the observable object changes. - ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฐ์ฒด์ ๊ฒ์๋ ํ๋กํผํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด SwiftUI๊ฐ ๊ฐ์ฒด์ ์์กดํ๋ **๋ชจ๋ ๋ทฐ**๋ฅผ ์ ๋ฐ์ดํธ - `StateObject` > A property wrapper type that instantiates an observable object. - SwiftUI๋ state object๋ฅผ ์ ์ธํ๋ ์ปจํ ์ด๋์ ์๋ช ๋์ model object์ ์ ์ธ์คํด์ค๋ฅผ ํ ๋ฒ๋ง ์์ฑ - ์๋ฅผ ๋ค์ด, SwiftUI๋ ๋ทฐ์ ์ ๋ ฅ์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์ง๋ง, ๋ทฐ์ ID๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์ ์ธ์คํด์ค๋ฅผ ์์ฑ - StateObject๋ฅผ ํตํด์ ๊ด์ฐฐ๋๊ณ ์๋ ๊ฐ์ฒด๋ ๊ทธ๋ค์ด ๊ฐ์ง๊ณ ์๋ ํ๋ฉด ๊ตฌ์กฐ๊ฐ ์ฌ์์ฑ๋์ด๋ ํ๊ดด๋์ง ์์. - `EnvironmentObject` > A property wrapper type for an observable object that a parent or ancestor view supplies. - superview์์ subview์ ํน์ ์ํ๋ฅผ ์ฃผ์ ํ์ฌ, subview์์ ๊ทธ ์ํ์ ์ ๊ทผํ ๋ ์ฌ์ฉ - subview์์ superview๋ก๋ถํฐ ์ฃผ์ ๋ฐ์ @EnvironmentObject ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝ์ํค๋ฉด ๋ถ๋ชจ์์๋ ๋ชจ๋ ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ - ์ ์ญ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ํํ์ด๋ฏ๋ก, ๋ทฐ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ๋ ์ฌ์ฉ
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up