簡體   English   中英

使用具有默認委托實現的另一個協議將委托分配給一個類?

[英]Assign delegate to a class using another protocol with default delegate implementation?

我有一個協議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,因此我認為ImagePickerPresentable擴展中的委托函數將被imagePicker委托識別。

您可以使用多播委托來實現此目的。

這里要檢查兩件事。

  1. 在哪里imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 完全被調用嗎?
  2. 我將添加一個guard語句來解包裝delegate ,並為不成功的解包裝返回另一種回調。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM