UIKit View를 SwiftUI 에서 사용하기
UIViewRepresetable 프로토콜 구현하여 View 구현체 작성
- makeUIView, updateUIView 메소드를 구현 해준다.
struct SampleUILabel: UIViewRepresentable {
@Binding var text: String
func makeUIView(context: Context) -> UILabel {
let label = UILabel()
label.textColor = .black
return label
}
func updateUIView(_ uiView: UILabel, context: Context) {
uiView.text = text
}
}
- SwiftUI의 프로퍼티 래퍼인 @Binding 등을 사용하여 SwiftUI -> UIKit 으로 데이터 전송이 가능하다.
- updateUIView 메소드 에서 데이터 변경시 뷰에 적용되는 내용을 구현한다.
- 사용시에는 기존 SwiftUI 컴포넌트를 사용하듯이 사용한다.
구현한 View 구현체 사용
struct ContentView: View {
@State var text: String
var body: some View {
VStack {
SampleUILabel(text: $text)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(text: "으악!")
}
}
UIViewControllerRepresetable 프로토콜 구현하여 ViewController 구현체 작성
struct MyUIController: UIViewControllerRepresentable {
@Binding var status: Bool
func makeUIViewController(context: Context) -> UICollectionViewController {
///... Controller 구현 코드 및 정의한 컨트롤러 사용
controller.view.delegate = context.coordinator
return controller
}
func updateUIViewController(_ uiViewController: FoodController, context: Context) {
//SwiftUI의 데이터 받아서 컨트롤러에서 받아 update처리 할 코드 작성
//@State는 작동하지 않는다. Binding 및 ObservedObject 사용.
}
func makeCoordinator() -> Coordinator {
return MyUIController.Coordinator(parent: self)
}
class Coordinator: NSObject, Delegate 및 DataSource 프로토콜 구현 {
var parent: MyUIController
init(parent: MyUIController) {
self.parent = parent
}
}
}
- UIViewControllerRepresentable 프로토콜을 구현하여 SwiftUI에서 사용할 수 있도록 정의 한다.
- 위의 UIView와 같이 SwiftUI에서 사용 한다.
- updateUIViewController 메소드 내에서 Binding 혹은 ObservableObject를 사용하는 경우, 해당 필드가 업데이트 될때마다 updateUIViewController 가 실행된다.
- delegate 및 DataSource를 구현한 Coordinator 를 makeCoordinator() 를 통해 리턴해주도록 하고, makeUIViewController에서 context.coordinator 로 할당해 준다.
- UIKit -> SwiftUI로 데이터를 보낼땐 Coordinator 내부에서 구현한 메소드 내에서 parent.변수로 접근한다.
'IOS' 카테고리의 다른 글
UIKit 커스텀 애니메이션 (0) | 2022.12.20 |
---|---|
SwiftUI NavigationView BackButton Custom (0) | 2022.11.05 |
NSCollectionLayoutDimension 알아보기 (0) | 2022.10.15 |
UIKit UIView 의 Frame 과 Bounds (0) | 2022.10.10 |
Swift 접근 한정자 (0) | 2022.10.05 |