【发布时间】: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