为自定义协议设置委托会干扰UIScrollViewDelegate方法

时间:2011-06-08 16:17:39

标签: objective-c cocoa-touch ios delegates protocols

我正在使用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");
}

2 个答案:

答案 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}中设置委托视图控制器的方法。

但是,这种方法存在问题。如果viewDidLoadImageScrollView的子类,顾名思义,滚动视图的UIScrollView属性将丢失。你也应该考虑到这一点。