2010-05-13 51 views
22

代码警告:设置的UIImagePickerController委托抛出一个关于UINavigationControllerDelegate

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

回答

43

UIImagePickerController继承自UINavigationController。代表属性是UINavigationController的一部分,因此它要求其委托符合UINavigationControllerDelegate协议。

delegate property声明,像这样:

@property(nonatomic, assign) id<UINavigationControllerDelegate> delegate; 

这告诉编译器来验证你的控制器将实现UINavigationConrollerDelegate协议。检查到位,以便如果您的控制器类未正确实施UINavigationController可能发送给其委托的所有方法,则可能会生成编译时警告。

如果你正在寻找一个解决方案,您可以指示(在你的控制器类接口)控制器符合该协议:

@interface MyController : NSObject <UINavigationControllerDelegate> 
    ... 
@end 

一旦做到这一点,编译器会警告你您尚未实施的任何必需的委托方法。这是一件好事,因为它会阻止您释放可能意外抛出“找不到方法”运行时错误的代码。

+0

谢谢你,我只是遇到了这个错误,你提供了一个快速的解决方案:) – KomodoDave 2011-10-12 14:30:53

+0

@KomodoDave:很高兴帮助! ':)' – 2011-10-12 16:51:29

+0

@ e.James接口MyController:NSObject ... – yunas 2012-05-28 07:52:40

6

e.James是对的。除此之外,UINavigationControllerDelegate仅指定可选方法。所以一个快速的解决方案就是让你的视图控制器在不实现任何方法的情况下实现协议。

我已经检查了所有用于UIImagePickerControllerDelegate实现的Apple示例代码,它们都没有实现任何UINavigationControllerDelegate方法。所以如果你不需要他们不要担心。

16

您可以在.h文件

@interface MyController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate> 
3

像这样做我也面临同样的问题,然后搜索后找到了解决办法即与在.h文件中的UIImagePickerControllerDelegate一起添加UINavigationControllerDelegate。

@interface LatestJobsVC : UIViewController <UIImagePickerControllerDelegate , UINavigationControllerDelegate> 

希望能帮到你。 谢谢