Установка делегата для пользовательского протокола мешает методам UIScrollViewDelegate - PullRequest
1 голос
/ 08 июня 2011

Я использую пользовательский подкласс 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 ]

1 голос
/ 08 июня 2011

Если вы хотите, чтобы контроллер представления был его делегатом, не устанавливайте делегат в инициализаторе.Когда вы создаете экземпляр ImageScrollView, вы должны установить его на контроллер представления.

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

Если вы создаете его через IB, то есть переименовываете имя класса из UIScrollView в ImageScrollView, вам нужно будет создать для него выход, а затем установить делегата в методе viewDidLoad контроллера представления.

Однако в этом подходе есть проблема.Если ImageScrollView является подклассом UIScrollView, как следует из названия, свойство delegate представления прокрутки теряется.Вы должны принять это во внимание также.

1 голос
/ 08 июня 2011

Вы будете иметь объявление 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;
 }
...