ios – 编译器无法看到与UIImagePickerControllerDelegate协议的一致性

ios – 编译器无法看到与UIImagePickerControllerDelegate协议的一致性,第1张

概述我错过了什么.这段代码运行正常,但我想清除所有编译器警告. Sending 'GSBBuilderImageButton *const __strong' to parameter of incompatible type 'id<UINavigationControllerDelegate,UIImagePickerControllerDelegate>' 在过去使用此警告消息的经验中,我从未注 我错过了什么.这段代码运行正常,但我想清除所有编译器警告.

Sending 'GSBBuilderImagebutton *const __strong' to parameter of incompatible type 'ID<UINavigationControllerDelegate,UIImagePickerControllerDelegate>'

在过去使用此警告消息的经验中,我从未注意到警告中提到了两个协议 – 而且很公平,在这种情况下,我不知道为什么会有对UINavigationControllerDelegate的引用.

但这是我的界面:

#import <UIKit/UIKit.h>#import "GSBImagebuttonDelegate.h"@interface GSBBuilderImagebutton : UIbutton <UIImagePickerControllerDelegate>{    UIPopoverController *popover;    UIImage *imageData;    NSURL *mediaURL;    ID <GSBBuilderImagebuttonDelegate> _delegate;}@property (strong,nonatomic) NSURL *mediaURL;@property (strong,nonatomic) UIImage *imageData;@property (strong,nonatomic) ID <GSBBuilderImagebuttonDelegate> delegate;- (voID)removePicture;- (voID)setimageData:(UIImage *)theImageData;@end

重要的是@interface声明,其中包括UIImagePickerControllerDelegate采用.

在我的实现中我注意到了一点(我想在我写这篇文章的时候我没有使用setTarget:forAction:forControlState:因为这个类以UIVIEw的形式开始):

- (voID)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{    // really need to check to see that the touch ended while within our bounds    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];    [imagePicker setSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum];    [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotolibrary];    [imagePicker setDelegate:self];

所以我读到的方式是本地对象imagePicker被告知它的委托是GSBBuilderImagebutton的这个实例,它在它的接口中声明它符合UIImagePickerControllerDelegate协议.这似乎是完全有效的,我们一直在做的事情.虽然我的GSBBuilderImagebutton确实有自己的委托,但除非我做错了,否则不应该这样做.

当然,还有更多,包括可选协议方法的实现

- (voID)imagePickerController:(UIImagePickerController *)picker dIDFinishPickingMediawithInfo:(NSDictionary *)info

我正在以编程方式构建此按钮,因此为了完整性,这是我正在使用的init:

- (ID)initWithFrame:(CGRect)frame{    self = [super initWithFrame:frame];    if (self) {        // Initialization code        [[self imageVIEw] setContentMode:UIVIEwContentModeScaleAspectFill];        UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(removePicture)];        [self addGestureRecognizer:longPress];    }    return self;}

(注意:不要挂断我对setimageData的定义…这是一个调用UIbutton的setimage的包装方法,但也有一些其他任务,它的遗产是相同的UIVIEw遗产 – 对于这个应用程序的2.0版我会覆盖setimage:!

解决方法 这正是警告消息所说的: UIImagePickerController‘s delegate property期望一个符合UIImagePickerControllerDelegate和UINavigationControllerDelegate协议的对象.这是因为图像选择器UI包括导航控制器;该协议中的方法是可选的,因此如果您不需要对它们执行任何 *** 作,则无需实现它们.

但是你仍然需要声明对两种协议的一致性

@interface GSBBuilderImagebutton : UIbutton <UIImagePickerControllerDelegate,UINavigationControllerDelegate>

其余代码与编译器警告无关.

更新:这是一个相关的提示.如果仅在类的实现中使用协议一致性,则无需在头文件中声明它.您可以在.m文件中的类扩展中声明一致性:

@interface GSBBuilderImagebutton () <UIImagePickerControllerDelegate,UINavigationControllerDelegate>@end
总结

以上是内存溢出为你收集整理的ios – 编译器无法看到与UIImagePickerControllerDelegate协议的一致性全部内容,希望文章能够帮你解决ios – 编译器无法看到与UIImagePickerControllerDelegate协议的一致性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1006269.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存