[SwiftUI] UIViewRepresentable 란 무엇인가?
서론
SecretTalk의 친구목록, 대화목록을 구현하기 위해 UITableView의 기능이 필요하다.
이는 SwiftUI에서는 구현되지 않았기 때문에 SwiftUI에서 UIKit을 사용하기 위한 방법을 찾다가
UIViewRepresentable 이라는 기능을 발견했다.
UIViewRepresentable 이란?
View를 SwiftUI View 계층 구조에 통합하는데 사용하는 UIKit View 래퍼이다.
구조
protocol UIViewRepresentable : View where Self.Body == Never
Protocol 형식이다.
개요
UIViewRepresentable 인스턴스를 사용하면 SwiftUI 인터페이스에서 UIView 객체를 생성 및 관리할 수 있다.
앱의 커스텀 인스턴스 중 하나에서 이 프로토콜을 채택하고 해당 메서드를 사용하여 뷰를 생성, 업데이트 및 제거 할 수 있다.
생성 및 업데이트 프로세스는 SwiftUI 뷰의 동작과 유사하며 이를 사용하여 앱의 현재 상태 정보로 뷰를 구성한다.
제거 프로세스를 사용하여 SwiftUI에서 뷰를 완전히 제거할 수 있다.
예를 들어 제거 프로세스를 사용하여 뷰가 사라지고 있음을 다른 객체에 알릴 수 있다.
SwiftUI 인터페이스에 뷰를 추가하려면 UIViewRepresentable 인스턴스를 생성하고 SwiftUI 인터페이스에 추가한다.
시스템은 뷰를 만들고 업데이트하기 위해 적절한 시간에 representable 인스턴스의 메서드를 호출한다.
다음 예제는 뷰 계층 구조에 커스텀 MyRepresentedCustomView 구조가 포함된 것을 보여준다.
struct ContentView: View {
var body: some View {
VStack {
Text("Global Sales")
MyRepresentedCustomView()
}
}
}
시스템은 뷰 내에서 발생하는 변경 사항을 SwiftUI 인터페이스의 다른 부분에 자동으로 전달하지 않는다.
뷰가 다른 SwiftUI 뷰와 연결되도록 하려면 이러한 상호 작용을 용이하게 하기 위해 Coordinator 인스턴스를 제공해야 한다.
예를 들어 Coordinator를 사용하여 target-action을 전달하고 뷰에서 SwiftUI 뷰로 메시지를 델리게이팅 한다.
사용 예제
struct MyRepresentedCustomView: UIViewRepresentable {
@Binding var text: String // @Bidning property: SwiftUI to UIKit Data Binding
func makeUIView(context: Context) -> UILabel {
let label = UILabel()
label.textColor = .red
return label
}
func updateUIView(_ uiView: UILabel, context: Context) {
uiView.text = text
}
}
makeUIView, updateUIView는 필수 구현이다.
makeUIView의 반환타입, updateUIView의 uiView 파라미터 타입에 사용할 UIKit View 타입을 동일하게 명시해야 한다.