【问题标题】:Assign delegate to a class using another protocol with default delegate implementation?使用具有默认委托实现的另一个协议将委托分配给一个类?
【发布时间】:2016-11-30 04:10:03
【问题描述】:

我有一个协议 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 委托,但 ImagePickerPresentable 在 imagePicker 完成选择媒体时没有得到回调。

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

由于我的 View Controller 符合 ImagePickerPresentable、UIImagePickerControllerDelegate 和 UINavigationControllerDelegate,我认为 ImagePickerPresentable 扩展中的委托函数会被 imagePicker 委托识别。

【问题讨论】:

    标签: ios swift delegates swift3 swift-protocols


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这里有两件事要检查。

      1. 在哪里调用imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])? 它被调用了吗?
      2. 我会添加一个guard 语句来解开delegate,然后返回另一个 一种未成功展开的回调。

      发布更多您正在使用的代码,例如示例控制器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 2018-01-01
        相关资源
        最近更新 更多