일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- DiffableDataSource
- DynamicMemberLookup
- GCD
- DependencyInjection
- SwiftUI
- swift
- rxswift
- MainScheduler.Instance
- CoreBluetooth
- 명품cppProgramming c++
- MainScheduler.asyncInstance
- 프로그래머스
- MainScheduler
- 오픈채팅방
- data_structure
- DispatchQueue
- combine
- IOS
- MethodSwilzzling
- 청년취업사관학교
- cleanarchitecture
- SRP
- GIT
- 등굣길
- leetcode
- 코테
- gitflow
- RaceCondition
- SeSAC
- Realm
- Today
- Total
Do.
SwiftUI - SwiftUI에서 UIkit View 가져오기 본문
SwiftUI는 정말 심플하고 직관적인 도구들을 제공해 주는데 이게 아직 나온지 얼마되지 않아서 그런건지 아니면 애초에 목적 자체가 그런건지 SwiftUI 만으로는 구현할 수 없는 기능들이 많다.
본 글의 목적은 SwiftUI에서 PHPickerVIewController를 사용하여 Image로 전달하기 위함이다.
SwiftUI와 UIKit View는 아래와 같은 방법으로 데이터를 교환? 한다.
사진 설명을 입력하세요.
SwiftUI는 Struct로 뷰를 표시하고 UIKit View는 Class로 뷰를 표시한다. 그 중간다리를 UIViewRepresentable 프로토콜과 Coordinator라는 것이 담당하고 있다.
struct PhotoPicker: UIViewControllerRepresentable {
//code
}
PHPickerViewCtonroller를 사용할 것으로 SwiftUI 구조체로는 UIViewControllerRepresentable 프로토콜을 채용한다.
프로토콜에서 요구하는 메소드는 makeUIViewController와 updateUIViewController, makeCoordinator이다.
struct PhotoPicker: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> some UIViewController {
var configuration = PHPickerConfiguration()
configuration.filter = .images
configuration.selectionLimit = 0
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
//
}
func makeCoordinator() -> PhotoCoordinator {
PhotoCoordinator(parent: self)
}
}
makeUIViewController에서는 UIVC를 반환하는데 여기서는 PHPickerVC를 반환하기 위해 작성되었다.
updateUIViewController는 업데이트 되는 상태값을 통해 View를 재표시 하는 기능을 하는데
만약에 PHPickerVC가 아니라 MapKit이라면 (지도를 표시하는 모듈) 지도가 스탠다드인지, 하이브리드인지, 위성인지 선택하는 상태를 전달받아 맵뷰를 업데이트 할 수 있다.
makeCoordinator는 UIViewRepersentable에서 UIKit Coordinator와 통신하기 위한 수단이다.
PhotoCoordinator는 PHPickerViewControllerDelegate을 수행하기 위한 클래스로 아래와 같이 작성한다.
import SwiftUI
import PhotosUI
struct PhotoPicker: UIViewControllerRepresentable {
@Binding var images: [UIImage]
@Environment(\.presentationMode) var presentationMode
func makeUIViewController(context: Context) -> some UIViewController {
var configuration = PHPickerConfiguration()
configuration.filter = .images
configuration.selectionLimit = 0
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
//
}
func makeCoordinator() -> PhotoCoordinator {
PhotoCoordinator(parent: self)
}
class PhotoCoordinator: NSObject, PHPickerViewControllerDelegate {
var parent: PhotoPicker
init(parent: PhotoPicker) {
self.parent = parent
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
let itemProviders = results.map(\.itemProvider)
for item in itemProviders {
if item.canLoadObject(ofClass: UIImage.self) {
item.loadObject(ofClass: UIImage.self) { image, error in
if let error = error {
print("Error", error.localizedDescription)
} else {
DispatchQueue.main.async {
if let image = image as? UIImage {
self.parent.images.append(image)
}
}
}
}
}
}
parent.presentationMode.wrappedValue.dismiss()
}
}
}
makeCoordinator 아래에 내부 클래스로 선언했는데 외부에 선언해도 되지만 해당 클래스가 다른 곳에서 표시되는것을 원치 않기 때문에 내부에 선언했다.
PhotoCoordinator는 NSObject와 PHPickerVC의 기능을 수행할 Delegate 하기 위해 각각 상속, 채용한다.
(NSObject는 클래스 이므로 상속)
Delegate 내용은 UIKit에서 사용하듯 사용하면 된다.
'iOS' 카테고리의 다른 글
Swift - 구조체 또는 클래스의 프로퍼티 순차적으로 값 얻기 (0) | 2022.02.09 |
---|---|
Swift - gitignore 파일 추가로 중요한 파일 숨기기 (0) | 2022.02.09 |
Swift - 남은 길이만큼 특정 문자로 채우기 (0) | 2022.02.09 |
Xcode 에서 option + click으로 assistant editor가 열리지 않을 때 (0) | 2022.02.09 |
Swift - 연산자 메소드와 커스텀 연산자 (0) | 2022.02.09 |