在另一个类接口文件中实现委托

时间:2012-05-17 19:26:23

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

我正在尝试通过在另一个类接口文件中实现它来实现委托,如下所示:

ImageScrollView.h

#import <UIKit/UIKit.h>

@protocol ImageScrollViewDelegate <NSObject>

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
- (void)scrollViewDidZoom:(UIScrollView *)scrollView;

@end

@interface ImageScrollView : UIScrollView <UIScrollViewDelegate>
{
    id <ImageScrollViewDelegate> _imageScrollViewDelegate;
}

@property(nonatomic, assign) id <ImageScrollViewDelegate> imageScrollViewDelegate;

@end

ImageScrollView.m

#import "ImageScrollView.h"

@implementation ImageScrollView

@synthesize imageScrollViewDelegate = _imageScrollViewDelegate;

...

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [self.imageScrollViewDelegate scrollViewDidScroll:scrollView];

}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView;
{
    [self.imageScrollViewDelegate scrollViewDidZoom:scrollView];
}

...

@end

然后我有一个实现ImageScrollViewDelegate的viewController:

ViewControllerSubClass.h

#import <UIKit/UIKit.h>

@protocol ImageScrollViewDelegate;

@interface ViewControllerSubClass : UIViewController <ImageScrollViewDelegate> //warning is here
{
}

@end 

ViewControllerSubClass.m

#import "ViewControllerSubclass.h"
#import "ImageScrollView.h"

@implementation ViewControllerSubClass

- (void)loadView
{
    ...

    [[self scrollView] setImageScrollViewDelegate:self];

    ...


- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    ...   
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    ...
}

@interface ViewControllerSubClass : UIViewController <ImageScrollViewDelegate>的@interface ViewControllerSubclass.h中,我收到警告:“找不到”ImageScrollViewDelegate“的协议定义四次,但代码仍在运行。

任何人都知道如何摆脱警告,或者如何正确实现委托(最好使用单独的文件?)。

3 个答案:

答案 0 :(得分:2)

您无法转发声明正在实施的协议。您需要#import ImageScrollView.h而不是声明@protocol ImageScrollViewDelegate。它工作的原因是因为该方法在运行时调用时存在于实现中,并且警告的原因是编译器在编译时不知道协议中有哪些方法。

答案 1 :(得分:2)

#import "ImageScrollView.h"ViewControllerSubClass.m移至ViewControllerSubClass.h。完成后,您可以删除@protocol ImageScrollViewDelegate;

答案 2 :(得分:0)

在ViewControllerSubclass.h文件中编写#import“ImageScrollView.h”并从ViewControllerSubclass.m文件中删除它。