2016-11-30 4 views
0

J'ai un ImagePickerPresentable de protocole:Affecter un délégué à une classe en utilisant un autre protocole avec l'implémentation déléguée par défaut?

protocol ImagePickerPresentable { 
    var imagePicker: UIImagePickerController? { get set } 
    func presentImagePicker(withSourceType: UIImagePickerControllerSourceType) throws 
    func dismissImagePicker() 
    weak var delegate: ImagePickerPresentableDelegate? { get set } 
} 

J'ai une extension avec la mise en œuvre par défaut pour les deux fonctions.

extension ImagePickerPresentable where Self: UIViewController 

ImagePickerPresentableDelegate:

protocol ImagePickerPresentableDelegate: class { 
    func imagePicker(imagePicker: UIImagePickerController, didFinishPickingImage image: UIImage?, withSuccess success: Bool) 
} 

J'ai essayé d'étendre ImagePickerPresentable pour la mise en œuvre par défaut des fonctions de délégué imagePicker:

extension ImagePickerPresentable where Self: UIImagePickerControllerDelegate & UINavigationControllerDelegate { 

func imagePickerControllerDidCancel(picker: UIImagePickerController) { 
    dismissImagePicker() 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
// No Callback 
    if let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage { 
     delegate?.imagePicker(imagePicker: picker, didFinishPickingImage: editedImage, withSuccess: true) 
    } else if let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     delegate?.imagePicker(imagePicker: picker, didFinishPickingImage: originalImage, withSuccess: true) 
    } else { 
     delegate?.imagePicker(imagePicker: picker, didFinishPickingImage: nil, withSuccess: false) 
    } 
    } 
} 

Dans le contrôleur de vue qui adopte le protocole que je cède moi en tant que délégué imagePicker , mais ImagePickerPresentable n'obtient pas le rappel lorsque l'imagePicker a fini de choisir le média.

Si j'implémente les fonctions de délégué du sélecteur d'image directement dans le contrôleur de vue, j'obtiens le rappel. Je pourrais installer une fonction dans le protocole qui manipule la sortie de fonction de délégué de sélecteur d'image mais est-il possible d'obtenir le délégué de sélecteur d'image pour employer l'exécution par défaut des fonctions de délégué de ImagePickerPresentable directement? Comme mon contrôleur View est conforme à ImagePickerPresentable, UIImagePickerControllerDelegate et UINavigationControllerDelegate, je pensais que les fonctions déléguées dans l'extension ImagePickerPresentable seraient reconnues par le délégué imagePicker.

Répondre

0

Vous pouvez utiliser un délégué multidiffusion pour cela.

0

Deux choses à vérifier ici.

  1. Où est appelé imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])? Est-ce qu'on l'appelle du tout?
  2. Je voudrais ajouter une instruction guard pour déballer delegate et renvoyer un autre type de rappel pour un déploiement infructueux.

Publiez plus de code, comme un exemple de contrôleur, que vous utilisez.