gpt4 book ai didi

ios - 编译器不符合 UIImagePickerControllerDelegate 协议(protocol)

转载 作者:可可西里 更新时间:2023-11-01 06:19:49 26 4
gpt4 key购买 nike

我错过了一些东西。这段代码运行良好,但我想清除所有编译器警告。

Sending 'GSBBuilderImageButton *const __strong' to parameter of incompatible type 'id<UINavigationControllerDelegate,UIImagePickerControllerDelegate>'

在过去处理此警告消息的经验中,我从来没有注意到警告中提到了 两个 协议(protocol)——很公平,在这种情况下,我不知道为什么要引用 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 被告知它的委托(delegate)是 GSBBuilderImageButton 的这个实例,它在其接口(interface)中声明它符合 UIImagePickerControllerDelegate 协议(protocol)。这似乎完全正确,而且我们一直在做。虽然我的 GSBBuilderImageButton 确实有自己的委托(delegate),但除非我做错了什么,否则不应对此产生影响。

之后当然还有更多,包括可选协议(protocol)方法的实现

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

我正在以编程方式构建此按钮,因此为了完整起见,这是我正在使用的初始化:

- (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需要一个符合 两者 UIImagePickerControllerDelegateUINavigationControllerDelegate 协议(protocol)的对象。这是因为图像选择器 UI 包含一个导航 Controller ;该协议(protocol)中的方法是可选的,因此如果您不需要对它们执行任何操作,则无需实现它们。

但您仍然需要声明符合这两个协议(protocol):

@interface GSBBuilderImageButton : UIButton <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

您的其余代码与编译器警告无关。


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

@interface GSBBuilderImageButton () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@end

关于ios - 编译器不符合 UIImagePickerControllerDelegate 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10984404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com