0Pricing
Swift Academy · Aula

Padrão Coordinator para comunicação com delegates

Use makeCoordinator() para encaminhar callbacks de delegates do UIKit ao SwiftUI.

Padrão Coordinator para comunicação com delegates é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.

Por que usar Coordinator?

Os delegados do UIKit exigem uma referência de objeto. Os tipos de valor do SwiftUI não podem atuar como delegados. O Coordinator faz a ponte.

struct ImagePicker: UIViewControllerRepresentable {
  @Binding var image: UIImage?
  // Coordinator will be the UIImagePickerControllerDelegate
}

makeCoordinator()

Implemente makeCoordinator(), retornando uma instância de Coordinator. O SwiftUI chama esse método antes de makeUIView/Controller.

func makeCoordinator() -> Coordinator {
  Coordinator(self)
}

A classe Coordinator

O Coordinator normalmente é uma classe (para garantir compatibilidade com delegados) que mantém uma referência ao seu representável pai.

class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
  var parent: ImagePicker
  init(_ parent: ImagePicker) { self.parent = parent }
}

Configurando o delegado

Em makeUIViewController, atribua context.coordinator como delegado.

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

Implementando métodos de delegado

Os retornos de chamada do delegado no Coordinator escrevem de volta no SwiftUI alterando as vinculações do pai.

func imagePickerController(
  _ picker: UIImagePickerController,
  didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
) {
  parent.image = info[.originalImage] as? UIImage
  picker.dismiss(animated: true)
}

Retorno de chamada de cancelamento

Implemente o delegado de cancelamento para fechar o seletor e, opcionalmente, notificar o SwiftUI.

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
  picker.dismiss(animated: true)
}

Fonte de dados por meio do Coordinator

Os Coordinators também podem implementar protocolos de fonte de dados (por exemplo, UITableViewDataSource) para visualizações de tabela ou coleção.

class Coordinator: NSObject, UITableViewDataSource {
  var parent: MyTableView
  init(_ p: MyTableView) { parent = p }
  func tableView(_ tv: UITableView, numberOfRowsInSection s: Int) -> Int { parent.items.count }
  func tableView(_ tv: UITableView, cellForRowAt ip: IndexPath) -> UITableViewCell {
    let cell = tv.dequeueReusableCell(withIdentifier: "cell", for: ip)
    cell.textLabel?.text = parent.items[ip.row]
    return cell
  }
}

Mantendo o Coordinator atualizado

Quando o SwiftUI renderiza novamente, updateUIViewController é chamado. Atualize a referência do Coordinator para o novo pai, se necessário.

func updateUIViewController(_ vc: UIImagePickerController, context: Context) {
  context.coordinator.parent = self
}

Vários delegados

Um Coordinator pode estar em conformidade com vários protocolos de delegado, centralizando todos os retornos de chamada do UIKit.

class Coordinator: NSObject,
  UIScrollViewDelegate,
  UITextViewDelegate,
  UISearchBarDelegate { ... }

Coordinator versus @Binding

Use @Binding para uma simples passagem de valores; use um Coordinator quando o UIKit exigir uma referência de delegado.

// Simple: @Binding var text: String -> updateUIView writes uiView.text = text
// Complex: coordinator mediates UITextViewDelegate -> parent.text = textView.text

Ciclo de vida do Coordinator

O Coordinator é criado uma vez por representável e permanece enquanto o representável estiver na hierarquia de visualizações.

// makeCoordinator called once → stable delegate reference
// updateUIView called many times → push state changes

Verificação rápida

Qual método você deve implementar em UIViewControllerRepresentable para criar o objeto que faz a ponte com o delegado?

Recapitulação da lição

O padrão Coordinator: implemente makeCoordinator(), crie uma classe em conformidade com os protocolos de delegado do UIKit, atribua-a por meio de context.coordinator em makeUIViewController e escreva de volta no SwiftUI usando vinculações armazenadas em parent.

Perguntas Frequentes

A aula “Padrão Coordinator para comunicação com delegates” é grátis?

Sim — o texto completo de “Padrão Coordinator para comunicação com delegates” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.

O que vou aprender em “Padrão Coordinator para comunicação com delegates”?

Use makeCoordinator() para encaminhar callbacks de delegates do UIKit ao SwiftUI. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Padrão Coordinator para comunicação com delegates”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. UIViewRepresentable: encapsulamento de views do UIKit
  2. Padrão Coordinator para comunicação com delegates
  3. UIViewControllerRepresentable
  4. UIHostingController: SwiftUI dentro do UIKit
← Voltar para Swift Academy