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

syn*_*nic 22 iphone

代码:

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self.navigationController presentModalViewController:picker animated:YES];
[picker release];
Run Code Online (Sandbox Code Playgroud)

警告出现picker.delegate = self;在线上:

Class 'CardEditor' does not implement the 'UINavigationControllerDelegate' protocol
Run Code Online (Sandbox Code Playgroud)

为什么UIImagePickerController会关心我的类是否实现了UINavigationControllerDelegate协议?

e.J*_*mes 43

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

委托财产声明,如下所示:

@property(nonatomic, assign) id<UINavigationControllerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

这告诉编译器验证您的控制器是否将实现该UINavigationConrollerDelegate协议.检查已到位,以便在控制器类未正确实现UINavigationController可能发送给其委托的所有方法时,可以生成编译时警告.

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

@interface MyController : NSObject <UINavigationControllerDelegate>
    ...
@end
Run Code Online (Sandbox Code Playgroud)

完成此操作后,编译器将警告您尚未实现的任何所需委托方法.这是一件好事,因为它会阻止您释放可能意外抛出"找不到方法"运行时错误的代码.


mat*_*att 16

你可以在.h文件中这样做

@interface MyController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate>
Run Code Online (Sandbox Code Playgroud)


sti*_*igi 6

e.James是对的.除此之外,UINavigationControllerDelegate仅指定可选方法.因此,快速解决方案是让视图控制器实现协议而不实现任何方法.

我已经检查了所有Apple Sample代码的实现,UIImagePickerControllerDelegate但它们都没有实现任何UINavigationControllerDelegate方法.所以,如果你不需要它们,请不要担心.