设置UIImagePickerController委托会抛出有关UINavigationControllerDelegate的警告

时间:2010-05-13 19:45:57

标签: iphone

代码:

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协议?

5 个答案:

答案 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