2010-02-06 65 views
0

为了支持缩放UIScrollView中的图像,我想我必须将MyController与UIScrollViewDelegate一致,如下所示。但是,即使编译器生成以下警告消息,它也能正常工作而不符合UIScrollViewDelegate。
警告:类“myController的”不执行“UIScrollViewDelegate”协议

是不是强制性的,以符合UIScrollViewDelegate在头文件?
如果我忘记符合,是否有任何副作用?
为什么我可以支持缩放UIScrollView而不符合UIScrollViewDelegate?

//@interface MyController : UIViewController <UIScrollViewDelegate> 
@interface MyController : UIViewController 
{ 
    UIScrollView *scrollView; 
    UIImageView *imageView; 
} 
@end 

@implementation HelloController 
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return imageView; 
} 

- (void)loadView 
{ 
    UIImage *img = [UIImage imageNamed:@"foo.png"]; 
    imageView = [[UIImageView alloc] initWithImage:img]; 
    imageView.userInteractionEnabled = NO; 

    scrollView = [[UIScrollView alloc] initWithFrame: [[UIScreen mainScreen] applicationFrame]]; 
    [scrollView setScrollEnabled:YES]; 
    [scrollView setContentSize:[imageView size]]; 
    [scrollView setMaximumZoomScale:2.0f]; 
    [scrollView setMinimumZoomScale:0.5f]; 
    [scrollView setDelegate:self]; 

    [scrollView addSubview:imageView]; 

    self.view = scrollView; 
    [scrollView release]; 
} 
@end 

回答

0

如果你的类实际实现的委托方法,你不会得到任何错误,因为它们会在需要时居然要求。

符合协议只是告诉编译器这个类实现了这些方法。因此,通过忽略它,编译器将生成一个警告,因为您将UIScrollView.delegate分配给一个类似于根据需要不符合UIScrollViewDelegate协议的类。

+0

感谢您的回答。这对我来说很有意义。但是,如果我通过Interface Builder分配委托,则Interface Builder不会投诉。这是有趣的行为。无论如何,再次感谢! – tomute 2010-02-06 17:17:15

1

替换此行:

[scrollView setDelegate:self]; 

与此:

[scrollView setDelegate:(id<UIScrollViewDelegate>)self]; 

不过,我不知道为什么编译器不能识别您已实现UIScrollViewDelegate

编辑:为了满足编译器,你也可以在协议上实现在.m文件中定义的私有类别:

@interface FormModel() <UIScrollViewDelegate> 
@end 
+0

对不起,我无法很好地解释我的问题。我修改了一下我的代码,但我的问题是为什么这个代码工作正常,而不符合头文件中的UIScrollViewDelegate。 – tomute 2010-02-06 10:34:44

+0

啊,我错过了你的编辑。您还可以将一个空类别添加到.m文件中:@interface FormModel() @end – rpetrich 2010-02-06 10:53:52