2016-11-30 7 views
0

У меня есть ImagePickerPresentable протокола:Назначить делегат классу с использованием другого протокола с внедрением делегата по умолчанию?

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

У меня есть расширение с реализацией по умолчанию для обеих функций.

extension ImagePickerPresentable where Self: UIViewController 

ImagePickerPresentableDelegate:

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

Я пытался продлить ImagePickerPresentable для реализации по умолчанию функций делегата 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) 
    } 
    } 
} 

В контроллере представления, который принимает протокол Поручаю себя как imagePicker делегата , но ImagePickerPresentable не получает обратный вызов, когда imagePicker закончил сбор медиа.

Если я реализую функции делегата выбора изображений непосредственно в контроллере представления, я получаю обратный вызов. Я мог бы настроить функцию в протоколе, которая обрабатывает функцию делегата сборщика изображений, но возможно ли, чтобы делегат сборщика изображений использовал стандартную реализацию функций ImagePickerPresentable delegate?

Поскольку контроллер View View соответствует ImagePickerPresentable, UIImagePickerControllerDelegate и UINavigationControllerDelegate, я думал, что функции делегата в ImagePickerPresentable extension будут распознаны делегатом imagePicker.

ответ

0

Для достижения этой цели вы можете использовать делегат многоадресной передачи.

0

Две вещи для проверки здесь.

  1. Где находится imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])? Это вообще называется?
  2. Я бы добавил заявление guard, чтобы развернуть delegate, и вернуть еще один вид обратного вызова для неуспешной развертки.

Опубликовать больше кода, как пример контроллера, который вы используете.