SwiftUI – Cómo usar componentes de SwiftUI en UIKit

Para usar cualquier vista de SwiftUI en UIKit es necesario usar la clase UIHostingController. Puedes ver su documentación completa aquí.

Para usarla debemos llamar al método init de UIHostingController y pasarle como parámetro una View de SwiftUI.

let viewController = UIHostingController(rootView: ContentView())

UIHostingController es un componente de SwiftUI cuya función es envolver un View en un UIViewController, el cual es el componente mínimo necesario en UIKit para presentar una pantalla. De esta forma, una vez que tengamos nuestra instancia de UIHostingController creada podemos navegar como si de cualquier otro UIViewController se tratara.

También podríamos crear una subclase de UIHostingController para controlar diferentes aspectos del ciclo de vida de la pantalla de UIKit, pudiendo acceder a la propiedad rootView, que será del tipo View indicado, teniendo a nuestra disposición todos las variables y funciones que estén accesibles.

Hay que tener especial cuidado porque no todos los métodos del ciclo de vida de UIKit son ejecutados en este caso (viewDidLoad no se ejecuta por ejemplo). Puedes consultar la documentación de UIHostingController aquí para ver los eventos a los que responde.

import UIKit
import SwiftUI

struct ContentView: View {
    let text: String = "Hello, World!"
    
    var body: some View {
        Text(text)
    }
    
    func doSomething() {
        print("Something")
    }
}

//You can use this class in UIKit
class ContentViewController: UIHostingController {
    
    required init() {
        super.init(rootView: ContentView())
    }
    
    //Use from Storyboard init
    @objc required dynamic init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder, rootView: ContentView())
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        rootView.doSomething()
        print(rootView.text)
    }
    
}

Y hasta aquí ha llegado nuestra guía sobre Swift. Esperamos que te haya gustado y/o sido de gran utilidad; esa era la idea. Si tienes alguna duda, escríbenos un comentario y nos encantará responderte.

Rafael Fernández,
iOS Tech Lider