UIImagePickerController和UINavigationControllerDelegate实现

时间:2019-03-04 17:15:59

标签: ios swift uiimagepickercontroller

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

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

enter image description here

但是只需提及UINavigationControllerDelegate就可以解决编译时错误。甚至没有实现任何额外的功能。

class ViewController: UIViewController ,UITextFieldDelegate 
,UIImagePickerControllerDelegate, UINavigationControllerDelegate

如果有人可以向我解释其背后的原因,那将是不二之选。

我正在使用

Swift 4.2

Xcode 10.1

3 个答案:

答案 0 :(得分:2)

screenshot of UIImagePickerController declarationdocumentation中,您可以看到UIImagePickerController继承自UINavigationController。

screenshot of delegate declaration 查看委托人声明,很明显,它要求您同时确认UIImagePickerControllerDelegateUINavigationControllerDelegate

为什么委托要求您同时确认两个协议?

UIImagePickerController是系统界面。此类旨在原样使用,并且不允许进行视觉修改。从下面的屏幕截图中可以看到,它带有导航栏。

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

这就是UIImagePickerController必须验证您对UINavigationControllerDelegate进行确认的原因。因此,您正在看到错误。还要注意,UINavigationControllerDelegate方法是可选的,因此您实际上不需要实现它们,这就是为什么当您提到UINavigationControllerDelegate时,它只是消除了错误。

screenshot of UIIMagePickerController

答案 1 :(得分:1)

UIImagePickerController的委托定义为

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

因此,您要设置的委托必须符合UINavigationControllerDelegate。

UINavigationControllerDelegate没有必填字段。因此,您无需实现任何函数或变量就可以实现这一点。因此,您的错误得以解决。

Screenshot of UINavDelegate

答案 2 :(得分:0)

如果您需要监视vc(imagePicker)的显示时间,然后实施UINavigationControllerDelegate方法,则其原理非常简单,否则它将具有含义,否则将无用,但这是强制性的