UIKit의 UIView 서브클래싱 한 클래스를 SwiftUI View에서 가져다 사용하는 방법입니다.

이전 블러그에 UIViewController 를 SwiftUI 에서 가져다 사용할때 UIViewControllerRepresentable 상속받아서

사용했다면 UIView 가져다 사용할 때는 UIViewRepresentable 상속받아서 사용하면 됩니다.

방식은 동일합니다.

 

IWKWebView 클래스는 UIView 를 상속받은 클래스로 SwiftUI 에서 가져다 사용할 경우 아래와 같이 이용하면 됩니다.

import SwiftUI

struct BaseWebView: UIViewRepresentable {
    var urlToLoad: String
    
    func makeUIView(context: Context) -> some IWKWebView {
        
        let baseWebview = IWKWebView()
        baseWebview.webViewLoad(urlString: urlToLoad, httpMethod: .GET)
        
        return baseWebview
    }
    
    func updateUIView(_ uiView: UIViewType, context: Context) {
        
    }
}

struct BaseWebView_Previews: PreviewProvider {
    static var previews: some View {
        BaseWebView(urlToLoad: "https://naver.com")
    }
}

 

대충 가져다 사용하는 방식은 동일합니다.

import SwiftUI

struct NetworkListContentView: View {    
    var body: some View {
        List{
            NavigationLink {
                ZStack {
                    BaseWebView(urlToLoad: "https://www.naver.com")
                }
                .edgesIgnoringSafeArea(.bottom)
            } label: {
                MainRowTitle(name: "WKWebView")
            }
        }
        .listStyle(.automatic)
        
    }
}

struct NetworkListContentView_Previews: PreviewProvider {
    static var previews: some View {
        NetworkListContentView()
    }
}

 

 

반대로 SwiftUI View 를 UIViewController의 View에 addSubview 하는 경우 아래와 같이 addSubview 하면 됩니다.

import UIKit
import SwiftUI

class TestViewController: UIViewController {
	override func viewDidLoad() {
    	super.viewDidLoad()
    }
    
    @IBAction func testButton(_ sender: Any) {
    	let testView = UIHostingController(rootView: TestView()).view!
		testView.frame = self.view.frame
        testView.backgroundColor = UIColor.red
        self.view.addSubview(testView)
    }
}

+ Recent posts