gpt4 book ai didi

objective-c - 为自定义协议(protocol)设置委托(delegate)会干扰 UIScrollViewDelegate 方法

转载 作者:行者123 更新时间:2023-11-29 11:22:27 25 4
gpt4 key购买 nike

我正在使用 UIScrollView 的自定义子类,名为 ImageScrollView。我需要知道用户何时点击 ScrollView ,所以我创建了一个协议(protocol)。我在我的 RootViewController 中实现了该协议(protocol),一切看起来都很好。当我构建它时,有一个警告

Class 'ImageScrollView' does not implement the 'TapDetectingImageViewDelegate' protocol".

检查 ImageScrollView 类中的 init 方法后,我发现是 self.delegate = self; 导致了问题。我声明自己是 UIScrollView 委托(delegate)方法的委托(delegate),但我也是我自己的协议(protocol)的委托(delegate)(我的协议(protocol)的委托(delegate)必须是 RootViewController,而不是 ImageScrollView)。

- (id)initWithFrame:(CGRect)frame{
if ((self = [super initWithFrame:frame])) {
self.showsVerticalScrollIndicator = NO;
self.showsHorizontalScrollIndicator = NO;
self.bouncesZoom = YES;
self.decelerationRate = UIScrollViewDecelerationRateFast;
self.delegate = self;
}
return self;
}

你们知道我该如何解决吗?或者更好的主意是告诉我的 RootViewController 用户点击了 UIScrollView/UIImage

ImageScrollView.h中的协议(protocol)声明

@protocol TapDetectingImageViewDelegate <NSObject>

@optional
- (void)tapDetectingImageView:(ImageScrollView *)view gotSingleTapAtPoint:(CGPoint)tapPoint;

@end

实现类的头文件

#import <UIKit/UIKit.h>
#import "ImageScrollView.h"

@interface AppleScrollViewViewController : UIViewController <UIScrollViewDelegate, TapDetectingImageViewDelegate>{

UIScrollView *pagingScrollView;
}

-(void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index;
- (CGRect)frameForPageAtIndex:(NSUInteger)index;
- (CGRect)frameForPagingScrollView;
- (UIImage *)imageAtIndex:(NSUInteger)index;
- (NSString *)imageNameAtIndex:(NSUInteger)index;
- (CGSize)imageSizeAtIndex:(NSUInteger)index;
- (NSArray *)imageData;

@end

实现它的 .m 类中的协议(protocol)方法

-(void)tapDetectingImageView:(ImageScrollView *)view gotSingleTapAtPoint:(CGPoint)tapPoint{
NSLog(@"SingleTap");
}

最佳答案

如果您希望 View Controller 成为它的委托(delegate),则不要在初始化程序中设置委托(delegate)。当您创建 ImageScrollView 实例时,您应该将它设置为 View Controller 。

ImageScrollView * aScrollView = [[ImageScrollView alloc] initWithFrame:aFrame];
aScrollView.delegate = self;
[..]

如果您通过 IB 创建它,即将 UIScrollView 的类名重命名为 ImageScrollView,您将必须为其创建一个导出,然后设置委托(delegate)在 View Controller 的 viewDidLoad 方法中。

但是,这种方法存在一个问题。如果 ImageScrollView 顾名思义是 UIScrollView 的子类,则 ScrollView 的 delegate 属性将丢失。您也应该考虑到这一点。

关于objective-c - 为自定义协议(protocol)设置委托(delegate)会干扰 UIScrollViewDelegate 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6281970/

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