Working with your UIViewController and SwiftUI

So you started playing with SwiftUI, and you enjoyed it ? Well, me too! The second it came out, I started to imagine all the use cases I'll enjoy implementing my views with this framework.

If like, me you wonder how to use your fresh made SwiftUI views along with your good old UIViewController, this is for you!

To work with you ViewControllers Apple added this magic protocol : UIViewControllerRepresentable.
How it works ?
Well, you have two options (at the moment) :

Make your UIViewController Representable.

Just conform to UIViewControllerRepresentable. Doing so, you'll have to make you UIViewController final, preventing your class from being inherited or being overridden.
This is what it would look like :

extension ViewController: UIViewControllerRepresentable {
    public typealias UIViewControllerType = ViewController

    public func makeUIViewController(context: UIViewControllerRepresentableContext<ViewController>) -> ViewController {
        return ViewController()
    }

    public func updateUIViewController(_ uiViewController: ViewController, context: UIViewControllerRepresentableContext<ViewController>) {
        //
    }
}

Using a wrapper.

The other option is to make a sort of ViewControllerWrapper. This is the one I chose to adopt as it does not require the class being final.
Just create a Struct that conforms to UIViewControllerRepresentable, and return an initialized ViewController in the makeUIViewController method :

struct ViewControllerWrapper: UIViewControllerRepresentable {

    typealias UIViewControllerType = ViewController

    func makeUIViewController(context: UIViewControllerRepresentableContext<ViewControllerWrapper>) -> ViewControllerWrapper.UIViewControllerType {
        return ViewController()
    }

    func updateUIViewController(_ uiViewController: ViewControllerWrapper.UIViewControllerType, context: UIViewControllerRepresentableContext<ViewControllerWrapper>) {
        //
    }
}

And simply call it in your SwiftUI views like so :

struct MyView : View {
    var body: some View {
        ViewControllerWrapper()
    }
}

Using a "wrapper" solution would allow to easily add any parameter to initialize your ViewController.

There you are.
Hope this will help!

Happy coding 🙂

Étiquettes :

Leave a Comment