Implementar protocolo através da extensão [duplicado]
Esta pergunta já tem uma resposta aqui:
Swift: o uso da extensão de protocolo resulta em "seletor não reconhecido enviado à instância" 2 respostasEstou tentando criar um protocolo que encerre o processo de usar o UIImagePickerController para torná-lo mais alinhado aos meus aplicativos. Eu basicamente tenho algo parecido com isto:
public protocol MediaAccessor : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func mediaCaptured(title: String, fileData: NSData, fileType: String)
}
e uma extensão que faz todo o trabalho pesado de solicitar a permissão e manipular os métodos delegados:
public extension MediaAccessor where Self : UIViewController {
public func captureMedia() {
//All sorts of checks for picker authorization
let picker = UIImagePickerController()
picker.delegate = self
self.presentViewController(picker, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
//implementation of the delegate in extension
//even though everything compiles, this method is not called on picker completion
}
}
Portanto, tudo é compilado, mas a implementação do UIImagePickerControllerDelegate por meio da extensão não parece ser registrada. Quando mostro o seletor, ele permite tirar uma foto, mas a chamada didFinishPickingImage nunca acontece. Se eu mover essa chamada diretamente para o controlador, tudo funcionará bem, mas a idéia era ocultar essas coisas do controlador de exibição para uma interface muito limpa, permitindo que um controlador acesse a mídia do dispositivo. A implementação de métodos de protocolo por meio de uma extensão como essa é algo que não pode funcionar? Existe algo que eu possa mudar para permitir que isso funcione, sem ter que implementar o protocolo diretamente no meu controlador de exibição?