UIImagePickerController 和 UINavigationControllerDelegate 实现

UIImagePickerController and UINavigationControllerDelegate implementation

我正在尝试使用 UIImagePickerController 从画廊中挑选一张图片。

如果我的视图控制器没有提到 UINavigationControllerDelegate。我将在尝试设置 UIImagePickerController 委托时遇到以下错误。

但仅提及 UINavigationControllerDelegate 即可解决编译时错误。甚至没有实现任何额外的功能。

class ViewController: UIViewController ,UITextFieldDelegate 
,UIImagePickerControllerDelegate, UINavigationControllerDelegate

如果有人能给我解释一下背后的道理,那就太好了。

我正在使用

Swift 4.2

Xcode 10.1

UIImagePickerController 的委托定义为

@property(nullable,nonatomic,weak) id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;

所以你要设置的delegate必须符合UINavigationControllerDelegate。

UINavigationControllerDelegate 没有必填字段。所以你不需要实现任何函数或变量来符合它。因此,您的错误已解决。

道理很简单,如果你需要在显示 vc ( imagePicker ) 时进行监视,然后实现 UINavigationControllerDelegate 方法,那么它就会有意义,否则它就没用了,但它是强制性的

documentation可以看出UIImagePickerController继承自UINavigationController

查看委托声明,很明显它需要您确认 UIImagePickerControllerDelegate & UINavigationControllerDelegate

为什么delegate需要你确认两个协议?

UIImagePickerController是系统界面。此 class 旨在按原样使用,不允许进行视觉修改。正如您从下面的屏幕截图中看到的那样,它带有一个导航栏。

一些 UIImagePickerControllerDelegate 方法如 imagePickerControllerDidCancel(_:) 需要与 UINavigationController 通信才能接收事件。

这就是为什么 UIImagePickerController 必须验证您正在向 UINavigationControllerDelegate 确认。因此,您看到了错误。另请注意 UINavigationControllerDelegate 方法是可选的,因此您实际上不需要实现它们,这就是为什么当您提到 UINavigationControllerDelegate.

时它只是简单地消除了错误