iPhone - UIImagePickerControllerDelegate继承

29

我向一个UIViewController中添加了一个UIImagePickerController,同时将UIImagePickerControllerDelegate指定给该UIViewController

当我执行以下代码时,

myPicker.delegate = self;

Xcode 给我返回以下警告信息:

warning: assigning to id from incompatible type 'RootViewController'

然后我在同一 UIViewController 中添加了 UINavigationControllerDelegate 协议,错误信息消失了。

所以当我添加一个 UIImagePickerController 时,我是否需要同时添加这两个协议到 UIViewController 中?

如果文档中说的 UIImagePickerControllerUINavigationController 的子类,那么这不应该是自动的吗?为什么我需要添加父级代理协议而不只是 UIImagePickerControllerDelegate 协议?

这是一个 bug 还是我漏掉了什么东西?

2个回答

62

正如您所指出的那样,UIImagePickerController 继承自 UINavigationController。它使用相同的 delegate 属性,但不声明自己的(假设存在的)"imagePickerDelegate",因此您的代理必须符合这两个协议。这是有意义的,因为您还将相同的代理分配给了UINavigationController 部分(该部分对图像选择器一无所知)。

在我看来,这里的API设计有些值得质疑,但无论如何,UINavigationControllerDelegate 中的所有方法都是可选的,因此仅需声明符合协议即可。


1
这是不合逻辑的,违反常识,而且文档总是含糊不清 - 但我怀疑问题就是这样。无论如何,谢谢! - Duck

33

按照下面的代码添加,您将看到警告消失。

@interface viewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> { }
@end

必须在你的界面中加入UIImagePickerControllerUINavigationController的协议,这样就可以使警告消失。


谢谢,它帮了我很多,快速解决了问题。 - Rinku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接