WKWebView는 UIKit의 뷰이기 때문에 SwiftUI에서 사용하려면 UIViewRepresentable 채택해야 한다.
UIKit 뷰를 SwiftUI 뷰 계층에서 사용하기 위한 wrapper
makeUIView(context:)
- 뷰를 생성하고 초기 상태를 구성updateUIView(_:context:)
- SwiftUI의 새로운 정보로 지정된 뷰의 상태를 업데이트struct WebView: UIViewRepresentable {
var url: String
func makeUIView(context: Context) -> some UIView {
guard let url = URL(string: self.url) else { return WKWebView() }
let webView = WKWebView()
webView.load(URLRequest(url: url))
return webView
}
func updateUIView(_ uiView: UIViewType, context: Context) {
// 업데이트 시 수행할 코드
}
}
Coordinator
인스턴스를 제공해야 함makeCoordinator()
- 뷰에서 SwiftUI 인터페이스로 변경 사항을 전달하는 데 사용하는 사용자 정의 인스턴스를 생성Coordinator
로 전달웹 뷰의 탐색 요청을 수락 또는 거부하고 진행 상황을 추적하는 프로토콜
struct WebView: UIViewRepresentable {
let url: String
let activityIndicator = UIActivityIndicatorView(style: .large)
// 생략
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
}
final class Coordinator: NSObject, WKNavigationDelegate {
var parent: WebView
init(_ parent: WebView) {
self.parent = parent
}
// 탐색이 시작했음을 대리자에게 알림
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
parent.activityIndicator.startAnimating()
}
// 탐색이 완료되었음을 대리자에게 알림
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
parent.activityIndicator.stopAnimating()
}
}
WebView
에 UIActivityIndicatorView를 추가하고 WKNavigationDelegate를 Coordinator
로 전달하여 탐색 시 로딩을 시작하고 탐색이 끝나면 로딩을 멈추도록 구현