티스토리 뷰
SwiftUI, PreferenceKey protocol 부모뷰에서 자식뷰 설정값 관리방법
applebuddy 2023. 3. 23. 08:10
SwiftUI에서 부모뷰가 자식뷰의 설정값을 감지할 수 있는 방법 중 하나로, PreferenceKey가 있어요.
오늘은 PreferenceKey protocol에 대한 개요와 함께 실제 사용 예시를 알아보도록 하겠습니다.
iOS SwiftUI, PreferenceKey protocol은 무엇인가?
PreferenceKey에 대한 Quick Help 정보를 먼저 보겠습니다. 요약 정보는 View에 의해 생산되는 값 이라고 합니다. protocol로 정의가 되어있고, PreferenceKey를 채택해서 사용하려면 몇가지 구현이 필요합니다.
PreferenceKey를 사용하면, 하위뷰에서 preference viewModifier를 통해 preferenceKey 값을 수정하면, 그 값을 부모 뷰에서 감지할 수 있는 장점이 있습니다.
예컨데, 특정 뷰에 한해서 특정 설정값이 바뀌거나 하더라도 이를 부모뷰가 별도로 감지할 수 있는 것입니다.
실제 구현부도 보겠습니다.
PreferenceKey는 Value라는 associatedtype을 갖고 이를 통해 다양한 타입을 관리하는데 사용할 수 있습니다.
PreferenceKey 사용을 위해서는 기본값을 의미하는 defaultValue와 다음 반환되는 Value 타입 값을 처리하는 reduce 메서드를 구현해야합니다.
이제 간단한 예제로 PreferenceKey를 만들고, 부모뷰 ~ 자식뷰와 소통하는 예시를 보도록 하겠습니다.
PrefrenceKey를 통해 부모뷰 ~ 자식뷰 간 소통방법
이제 PreferenceKey를 사용해봅시다. MyPreferenceKey 구조체는 PreferenceKey를 채택하고 있습니다.
앞서 PreferenceKey를 준수하기 위해서 defaultValue, reduce(value:,nextValue:)를 정의해야한다고 했죠. 그래서 구현을 해두었습니다.
reduce 메서드에서는 새로 설정 된 값을 별다른 연산 없이 그대로 업데이트 하도록 구현했습니다.
부모뷰로 ContentView를 구현했습니다. NavigationLink를 통해서 "Hello, world!" 텍스트를 터치하면 NavigationLink에 의해 SecondView로 이동합니다.
preference viewModifier를 사용하면 해당 뷰가 노출될 때 특정 PreferenceKey에 대한 값을 설정할 수 있습니다. 그렇게 설정되어 변경되는 값은 바깥 블럭에 붙힌 onPreferenceChange viewModifier에서 감지하게 됩니다.
preference viewModifier에서 value를 설정했더라도, 이전 값과 설정하려한 값이 동일하면, onPreferenceChange에서 별다른 이벤트를 감지받지 못하는 점을 유의합니다.
이제 SecondView에서 preferenceKey value를 설정했을때, 부모뷰인 ContentView에서 그 값을 감지할 수 있는지 보겠습니다.
SecondView입니다. SecondView가 보이면 preference viewModifier에 의해 0 ~ 100 사이 랜덤 값이 MyPreferenceKey의 value로 설정이 됩니다.
그 값을 부모뷰인 ContentView의 onPreferenceChange viewModifier에서 감지할 수 있습니다.
정말 상위뷰에서 하위뷰의 preferenceKey value 업데이트를 감지하고 있는지는 아래 영상을 참고하시면 되겠습니다.
iOS SwiftUI, preferenceKey protocol 활용 예제 동작 예시
위와 같이 부모뷰에서 자식뷰의 preferenceKey value 업데이트를 감지하는 것을 보실 수 있습니다.
예제에서는 임의로 간단하게 랜덤한 정수 값을 PreferenceKey value로 설정했고, 부모뷰에서 업데이트된 PreferenceKey value 이벤트를 받는 것을 확인해봤습니다.
이런 특성을 잘 활용하면 앱의 전역적인 설정 값을 특정 하위뷰에 한해서 변경해서 사용해야할때 (ex) 탭바, 네비게이션바와 같이 공용 UI에 대한 특정 환경변수 설정 값의 변경 등) 유용하게 사용이 가능합니다.
지금까지 SwiftUI에서 활용가능한 protocol, PreferenceKey를 활용해서 자식뷰 설정 값을 부모뷰 측에서 관리하는 방법을 예제와 함께 알아보았습니다.
기타 다른 의견이나 피드백 있으시다면 언제든 댓글 부탁드립니다. PreferenceKey 관련 포스팅 마치겠습니다. 감사합니다. 🤗
'iOS 개발 > SwiftUI, Combine' 카테고리의 다른 글
iOS Combine Publisher 스레드 지정 간 RunLoop.main, Dispatchqueue.main 차이 (2) | 2023.05.03 |
---|---|
SwiftUI와 MainActor, View와 async await 기능 메인스레드 동작 여부 (0) | 2023.04.10 |
iOS Combine merge(with:) operator 특징 및 실 사용방법 (0) | 2023.01.15 |
iOS Font Asset 추가 및 SwiftUI Text View 폰트 적용 방법 (0) | 2023.01.10 |
Combine type erasure, eraseToAnyPublisher 역할 및 사용이점 (2) | 2022.12.11 |
- Total
- Today
- Yesterday
- swift 기초
- swift문제
- 프로그래머스
- swift
- swift reduce
- 김프매매
- 자연어처리
- swift string
- SwiftUI
- swift알고리즘
- 컬렉션
- 부스트코스
- swift 문자열
- 프로토콜
- CoreML
- 백준알고리즘
- 스위프트
- 백준swift
- Swift 알고리즘
- 알고리즘
- 개발자문서
- 프로그래머스swift
- 알고리즘문제
- Collection
- swift언어
- publisher
- Protocol
- uikit
- createML
- ios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |