我有一个协议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扩展中的委托函数。
答案 0 :(得分:0)
您可以使用多播委托来实现此目的。
答案 1 :(得分:0)
这里要检查两件事。
imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [String : Any])
被叫到哪里?
它被召唤了吗?guard
语句来解包delegate
,然后返回另一个语句
一种不成功展开的回调。 发布更多代码,例如您正在使用的示例控制器。