ํ๋กํผํฐ ๋ํผ @Environment
@Environment๋ SwiftUI์์ ์ฌ์ฉ๋๋ ํ๋กํผํฐ ๋ํผ(wrapper)๋ก, SwiftUI ๋ทฐ์ ์ปจํ ์คํธ(Context)์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
@Environment๋ฅผ ์ฌ์ฉํ๋ฉด ๋ทฐ์์ ์์คํ ์ ์ค์ ์ด๋ ์ํ์ ๊ฐ์ ์ปจํ ์คํธ์ ๋ํ ์ ๋ณด์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ทฐ๊ฐ ๋คํฌ ๋ชจ๋์์ ์คํ ์ค์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ํด๋น์ ๋ฐ๋ผ ๋ค๋ฅธ ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ํ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ง๊ฒ ํ ์คํธ๋ฅผ ํ์ํ๊ฑฐ๋, ์์คํ ์ ์ก์ธ์ค ๊ถํ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฑ์ ์์ ๋ ๊ฐ๋ฅํฉ๋๋ค.
@Environment๋ ์ผ๋ฐ์ ์ผ๋ก @State, @Binding, @ObservedObject ๋ฐ @EnvironmentObject์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ค์ ๋ชจ๋ SwiftUI์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. @Environment๋ ๋ทฐ์ ๋ ๋๋ง์ ์ํฅ์ ์ฃผ๋ ๋์ ์ธ ๊ฐ์ด๊ธฐ ๋๋ฌธ์, ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ค ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์์
@Environment(\.colorScheme)
์๋ฅผ ๋ค์ด, @Environment(\.colorScheme)๋ ํ์ฌ ์์คํ ์ ์์ ์คํค๋ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์ ์คํค๋ง์ ๊ฐ์ด ๋ฐ๋๋ฉด SwiftUI๊ฐ ๋ทฐ๋ฅผ ์๋์ผ๋ก ๋ค์ ๋ ๋๋งํฉ๋๋ค.
struct MyView: View {
@Environment(\\.colorScheme) var colorScheme
var body: some View {
Text("Hello, world!")
.foregroundColor(colorScheme == .dark ? .white : .black)
}
}
@Environment(\.locale)
ํ์ฌ ๋ก์ผ์ผ์ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ทฐ์์ ํ์ฌ ์ธ์ด์ ๋ง๋ ํ ์คํธ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
struct MyView: View {
@Environment(\\.locale) var locale
var body: some View {
Text("Hello, world!")
.font(.title)
.foregroundColor(.blue)
.frame(width: 200, height: 100)
.overlay(Text("Current language: \\(locale.languageCode ?? "")"))
}
}
@Environment(\.isEnabled)
ํ์ฌ ๋ทฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฐ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ด์ฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
struct MyView: View {
@Environment(\\.isEnabled) var isEnabled
var body: some View {
VStack {
TextField("Enter text", text: .constant(""))
.padding()
.background(isEnabled ? Color.white : Color.gray)
.disabled(!isEnabled)
Button(action: {}) {
Text("Submit")
}
.disabled(!isEnabled)
}
}
}
@Environment(\.presentationMode)
ํ์ฌ ๋ทฐ์ ํ๋ ์ ํ ์ด์ ๋ชจ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ทฐ๋ฅผ ๋ซ๊ฑฐ๋, ๋ค๋ฅธ ๋ทฐ๋ก ์ ํํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
struct MyView: View {
@Environment(\\.presentationMode) var presentationMode
var body: some View {
VStack {
Text("Hello, world!")
Button(action: {
presentationMode.wrappedValue.dismiss()
}) {
Text("Dismiss")
}
}
}
}
์ ์์๋ค์์๋ ์ ์ ์๋ฏ์ด @Environment๋ SwiftUI์์ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ์์ ์ปจํ ์คํธ(Context)์ ๋ํ ์ ๋ณด์ ์ก์ธ์คํ๊ณ , ๋์ ์ผ๋ก ๊ฐ์ ์ ๋ฐ์ดํธํ๋ฉฐ, ๋ทฐ๋ฅผ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค.
UIKit์์๋?
@Environment์ SwiftUI์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ๋๋ค. UIKit์์๋ ์ด์ ์ ์ฌํ ๊ฐ๋ ์ผ๋ก, ์ฑ์ ์ ๋ฐ์ ์ธ ์ํ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ด๋ฆฌํ๋ ์ฑ ๋ธ๋ฆฌ๊ฒ์ดํธ(App Delegate)๋ ๋ทฐ ์ปจํธ๋กค๋ฌ(View Controller)์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋(lifecycle method) ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
'๐ Apple > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] ์ฑ์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋ฉด ๋ณด์ฌ์ฃผ๊ธฐ (App Switcher์์ ์ฑ ํ๋ฉด ๊ฐ๋ฆฌ๊ธฐ) (0) | 2024.10.20 |
---|---|
[SwiftUI] String์ ํฌํจ๋ HTML ํ๊ทธ ์ญ์ (0) | 2023.11.15 |
[SwiftUI] ViewBuilder๋? (1) | 2023.04.23 |
[SwiftUI] ๋ฒํผ radius, border ๊ฐ ์ฃผ๊ณ ์ถ์ ๋ (0) | 2023.04.13 |
[SwiftUI] How to hide the iPad sidebar in navigation view (1) | 2023.04.09 |