代码:
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self.navigationController presentModalViewController:picker animated:YES];
[picker release];
警告显示在picker.delegate = self;
行:
Class 'CardEditor' does not implement the 'UINavigationControllerDelegate' protocol
为什么UIImagePickerController会关心我的类是否实现了UINavigationControllerDelegate协议?
答案 0 :(得分:43)
UIImagePickerController
继承自UINavigationController
。委托属性是UINavigationController
的一部分,因此它要求其委托符合UINavigationControllerDelegate
协议。
delegate property的声明如下:
@property(nonatomic, assign) id<UINavigationControllerDelegate> delegate;
这告诉编译器验证您的控制器是否将实现UINavigationConrollerDelegate
协议。检查已到位,以便在控制器类未正确实现UINavigationController
可能向其委托发送的所有方法时生成编译时警告。
如果您正在寻找解决方案,您可以指示(在您的控制器类界面中)您的控制器符合该协议:
@interface MyController : NSObject <UINavigationControllerDelegate>
...
@end
完成此操作后,编译器将警告您尚未实现的任何所需委托方法。这是一件好事,因为它会阻止您释放可能意外抛出“找不到方法”运行时错误的代码。
答案 1 :(得分:16)
您可以在.h文件中执行此操作
@interface MyController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate>
答案 2 :(得分:6)
e.James是对的。除此之外,UINavigationControllerDelegate
仅指定可选方法。因此,快速解决方案是让视图控制器实现协议而不实现任何方法。
我已经检查了所有Apple示例代码以了解UIImagePickerControllerDelegate
的实现,但它们都没有实现任何UINavigationControllerDelegate
方法。所以,如果你不需要它们,请不要担心。
答案 3 :(得分:3)
在搜索找到解决方案后,我也遇到了同样的问题,即在.h文件中添加UINavigationControllerDelegate和你的UIImagePickerControllerDelegate。
@interface LatestJobsVC : UIViewController <UIImagePickerControllerDelegate , UINavigationControllerDelegate>
希望能帮到你。 感谢
答案 4 :(得分:0)
对于Swift 4:
@interface MyController:UIViewController,UINavigationControllerDelegate,UIImagePickerControllerDelegate