使用具有默认委托实现的其他协议将委托分配给类?

时间:2016-11-30 04:10:04

标签: ios swift delegates swift3 swift-protocols

我有一个协议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)
    }
  }
}

在采用协议的视图控制器中,我将self指定为imagePicker委托,但是当imagePicker完成拾取媒体时,ImagePickerPresentable不会获得回调。

如果我直接在视图控制器中实现图像选择器委托功能,我会得到回调。我可以在协议中设置一个处理图像选择器委托函数输出的函数,但是可以让图像选择器委托直接使用ImagePickerPresentable委托函数的默认实现吗?

由于我的View Controller符合ImagePickerPresentable,UIImagePickerControllerDelegate和UINavigationControllerDelegate,我认为ImagePicker委托可以识别ImagePickerPresentable扩展中的委托函数。

2 个答案:

答案 0 :(得分:0)

您可以使用多播委托来实现此目的。

答案 1 :(得分:0)

这里要检查两件事。

  1. imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])被叫到哪里? 它被召唤了吗?
  2. 我要添加一个guard语句来解包delegate,然后返回另一个语句 一种不成功展开的回调。
  3. 发布更多代码,例如您正在使用的示例控制器。

相关问题