@Environment
- 프로퍼티 Wrapper 이다. ( 프로퍼티 감싸는 놈 )
ㄴ 그렇기 때문에 값을 꺼내서 쓰려면 ?.wrappedValue 로 꺼내야 한다.
- 다른 뷰에서 @Environment 프로토콜을 채택한 프로퍼티가 있으면 그걸 갖다가 가져다 쓰는 해당 뷰의 UI 갱신 여부와 엮을 수 있다.
ㄴ 마치 Redux의 전역 변수 같은 느낌이다.
어떻게 쓸까? * https://seons-dev.tistory.com/entry/SwiftUI-Environment-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-%EB%9E%98%ED%8D%BC 참고
1. 먼저 환경 키를 생성한다.
예를 들어서 이렇게 캡션 컬러키를 Environment 변수로 만들고 싶다면 다음과 같이 EnvironmentKey 프로토콜을 구현하는 구조체를 만든다음에 기본값을 설정할 때는 defaultValue 정적 상수에 초기화 한다.
private struct CaptionColorKey: EnvironmentKey {
static let defaultValue = Color(.secondarySystemBackground)
}
2. 키를 만들었으니까 값을 만들자. EnvironmentValues 타입에 우리가 사용할 이름을 설정하고, getter와 setter를 정의한다.
extension EnvironmentValues {
var captionBackgroundColor: Color {
get { self[CaptionColorKey.self] }
set { self[CaptionColorKey.self] = newValue }
}
}
3. 이후에 사용할 때는
@Environment(\.captionBackgroundColor) var captionBackColor
로 사용하면 된다. 그럼 해당 뷰가 바뀔때마다 해당 환경변수를 구독한 뷰들은 리렌더링 되게 된다.
** 뷰 수정자를 넣을 수도 있다. (선택사항)
ContentView()
.environment(\.captionBackgroundColor, .yellow)
@Environment(\.EditMode) var editMode
- 사용자가 뷰의 내용을 편집할 수 있는지 여부를 확인
Swift Tutorials - working with ui controls에서 다음의 코드에서 등장
import SwiftUI
struct ProfileHost: View{
// ModelData를 가져와서 이 뷰의 환경변수로 사용할 것임!
@Environment(ModelData.self) var modelData
@Environment(\.editMode) var editMode
@State private var draftProfile = Profile.default
var body : some View{
if editMode?.wrappedValue.isEditing == true{
Text("편집모드")
}
}
.
.
.
.
}
#Preview{
.
.
.
.
}
'Ios > Swift UI' 카테고리의 다른 글
부모뷰에서 자식뷰로 상태를 바인딩해서 전달할 때 : $ (0) | 2024.07.26 |
---|---|
@State, @Binding, @ObservedObject (0) | 2024.07.26 |
Swift UI 메서드 정리 ( 계속 추가 ) (2) | 2024.07.24 |
이것저것 Swift 메모용(찾아갈만한게 있을 수도 있고 없을 수도 있어요) (3) | 2024.07.23 |
@Environment로 커스템 데이터모델을 환경에서 가져오기 (4) | 2024.07.22 |