Working with your UIViewController and SwiftUI

kevinmaarek

Maarek

Posted on June 11, 2019

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>) {
        //
    }
}

Enter fullscreen mode Exit fullscreen mode

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>) {
        //
    }
}
Enter fullscreen mode Exit fullscreen mode

And simply call it in your SwiftUI views like so :

struct MyView : View {
    var body: some View {
        ViewControllerWrapper()
    }
}
Enter fullscreen mode Exit fullscreen mode

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

There you are.
Hope this will help!

Happy coding :)

šŸ’– šŸ’Ŗ šŸ™… šŸš©
kevinmaarek
Maarek

Posted on June 11, 2019

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related