我正在使用UIScrollView
的自定义子类ImageScrollView
。我需要知道用户何时点击滚动视图,因此我创建了一个协议。我在RootViewController
中实现了协议,一切看起来都不错。当我构建它时,会发出警告
类'ImageScrollView'没有实现'TapDetectingImageViewDelegate'协议“。
检查init
课程中的ImageScrollView
方法后,我发现self.delegate = self;
导致了问题。我声明自己是UIScrollView
委托方法的委托,但我也是我自己的协议的委托(我的协议的委托必须是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 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类中的协议方法
-(void)tapDetectingImageView:(ImageScrollView *)view gotSingleTapAtPoint:(CGPoint)tapPoint{
NSLog(@"SingleTap");
}
答案 0 :(得分:1)
您将在RootViewController
的 .h 文件中声明ImageScrollView
代表,
将根代表的名称更改为rootDelegate
;
在ImageScrollView.h中
RootViewControllerDelegate* rootDelegate;
@property(nonatomic,assign) RootViewControllerDelegate* rootDelegate;
ImageScrollView.m文件中的
@synthesize rootDelegate;
- (id)initWithFrame:(CGRect)frame{
if ((self = [super initWithFrame:frame])) {
self.showsVerticalScrollIndicator = NO;
self.showsHorizontalScrollIndicator = NO;
self.bouncesZoom = YES;
self.decelerationRate = UIScrollViewDecelerationRateFast;
self.delegate = self;
// Root controller delegate.
self.rootDelegate = self;
}
return self;
}
答案 1 :(得分:1)
如果您希望视图控制器成为其委托,则不要在初始化程序中设置委托。在创建ImageScrollView
实例时,应将其设置为视图控制器。
ImageScrollView * aScrollView = [[ImageScrollView alloc] initWithFrame:aFrame];
aScrollView.delegate = self;
[..]
如果您通过IB创建它,即将UIScrollView
的类名重命名为ImageScrollView
,则必须为其创建一个插座,然后在{{1}中设置委托视图控制器的方法。
但是,这种方法存在问题。如果viewDidLoad
是ImageScrollView
的子类,顾名思义,滚动视图的UIScrollView
属性将丢失。你也应该考虑到这一点。