0Pricing
Swift Academy · Lección

UIViewControllerRepresentable

Integre controladores de vista completos de UIKit, como UIImagePickerController, en SwiftUI.

UIViewControllerRepresentable es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué es UIViewControllerRepresentable?

Es similar a UIViewRepresentable, pero integra un UIViewController completo para usarlo dentro de SwiftUI.

struct ImagePickerView: UIViewControllerRepresentable {
  @Binding var image: UIImage?
}

makeUIViewController

Cree y configure el controlador de vista de UIKit. Se llama una vez cuando SwiftUI representa por primera vez el representable.

func makeUIViewController(context: Context) -> UIImagePickerController {
  let vc = UIImagePickerController()
  vc.delegate = context.coordinator
  return vc
}

updateUIViewController

Se llama cada vez que cambia el estado de SwiftUI. Transfiera los valores actualizados al controlador de vista existente.

func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
  // Update vc if needed (e.g., change source type)
}

dismantleUIViewController

Método estático de limpieza que se llama antes de retirar el controlador de vista de la jerarquía.

static func dismantleUIViewController(_ vc: UIImagePickerController, coordinator: Coordinator) {
  vc.dismiss(animated: false)
}

Integración de UIDocumentPickerViewController

Ejemplo: integre un selector de documentos para permitir que los usuarios seleccionen archivos y devuelvan sus URL a SwiftUI.

struct DocumentPicker: UIViewControllerRepresentable {
  @Binding var url: URL?
  func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
    let picker = UIDocumentPickerViewController(forOpeningContentTypes: [.pdf])
    picker.delegate = context.coordinator
    return picker
  }
  func updateUIViewController(_ vc: UIDocumentPickerViewController, context: Context) {}
}

Presentación modal

Incluya UIViewControllerRepresentable dentro de un .sheet para presentarlo de forma modal.

@State private var showPicker = false
var body: some View {
  Button("Pick Image") { showPicker = true }
    .sheet(isPresented: $showPicker) {
      ImagePickerView(image: $selectedImage)
    }
}

Ejemplo de Mail Composer

Integre MFMailComposeViewController para presentar una hoja de redacción de correo desde SwiftUI.

struct MailView: UIViewControllerRepresentable {
  @Binding var isShowing: Bool
  func makeUIViewController(context: Context) -> MFMailComposeViewController {
    let vc = MFMailComposeViewController()
    vc.mailComposeDelegate = context.coordinator
    vc.setSubject("Hello from SwiftUI")
    return vc
  }
  func updateUIViewController(_ vc: MFMailComposeViewController, context: Context) {}
}

Cobertura a pantalla completa

Aplique .fullScreenCover a los controladores de vista que deban ocupar toda la pantalla.

.fullScreenCover(isPresented: $showCamera) {
  CameraViewController()
}

Transferencia de closures para callbacks

En lugar de bindings, pase callbacks de tipo closure al representable para notificar eventos.

struct VideoPlayer: UIViewControllerRepresentable {
  let url: URL
  var onFinish: () -> Void
  // Coordinator calls onFinish when playback ends
}

Tamaño intrínseco

Los controladores de vista de UIKit determinan su propio tamaño. Use modificadores de frame de SwiftUI o el tamaño de contenido preferido del controlador de vista.

struct Popover: UIViewControllerRepresentable {
  func makeUIViewController(context: Context) -> UIViewController {
    let vc = UIViewController()
    vc.preferredContentSize = CGSize(width: 300, height: 200)
    return vc
  }
  func updateUIViewController(_ vc: UIViewController, context: Context) {}
}

Casos de uso habituales

UIViewControllerRepresentable se usa habitualmente para: UIImagePickerController, MFMailComposeViewController, AVPlayerViewController, UIDocumentPickerViewController y SFSafariViewController.

import SafariServices
struct SafariView: UIViewControllerRepresentable {
  let url: URL
  func makeUIViewController(context: Context) -> SFSafariViewController {
    SFSafariViewController(url: url)
  }
  func updateUIViewController(_ vc: SFSafariViewController, context: Context) {}
}

Comprobación rápida

¿Qué método llama SwiftUI cada vez que cambian las entradas de SwiftUI del representable?

Resumen de la lección

UIViewControllerRepresentable integra controladores de vista completos de UIKit. Implemente makeUIViewController (crear una vez), updateUIViewController (sincronizar el estado) y, opcionalmente, dismantleUIViewController (limpiar). Use Coordinator para las llamadas de los delegados.

Preguntas frecuentes

¿La lección «UIViewControllerRepresentable» es gratis?

Sí — el texto completo de «UIViewControllerRepresentable» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «UIViewControllerRepresentable»?

Integre controladores de vista completos de UIKit, como UIImagePickerController, en SwiftUI. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «UIViewControllerRepresentable»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. UIViewRepresentable: integración de vistas de UIKit
  2. Patrón Coordinator para la comunicación con delegates
  3. UIViewControllerRepresentable
  4. UIHostingController: SwiftUI dentro de UIKit
← Volver a Swift Academy