UIScrollView实现委托

问题描述:

我有一个视图控制器有三个滚动视图作为子视图。我希望每当页面发生变化时,子视图滚动视图都会通知父视图控制器。UIScrollView实现委托

我以为我会通过设置委托模式来做到这一点。我的孩子(的UIScrollView的子类)设置它在头文件:

@interface TriptychScrollView : UIScrollView <UIScrollViewDelegate> { 
    id delegate; 
} 

- (id)delegate; 
- (void)setDelegate:(id)newDelegate; 
@end 

@protocol RCScrollDidChange 
@optional 
- (void)scrollView:(TriptychScrollView *)scrollView imageDidChange:(NSNumber *)index; 
@end 

源文件具有委托存取方法:

- (id)delegate { 
    return delegate; 
} 
- (void)setDelegate:(id)newDelegate { 
    delegate = newDelegate; 
} 

不幸的是,这意味着我的委托设置为自己的呼叫被忽略:

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self setDelegate:self]; 
    } 
    return self; 
} 

..因此,这两种方法scrollViewDidScroll:scrollViewDidEndDecelerating:没有得到所谓的!这意味着我已经有效地失去了对滚动视图的控制。

我这样做不正确吗?或者,有没有更好的方式让孩子子视图发送消息给他们的父母?

+0

三个滚动视图都有自己的控制器实例吗?你为什么设置“自我”作为代表?通常你会让父母创建孩子并将自己设置为委托。 – JAgostoni 2011-04-20 20:21:13

我可能不明白整个问题,但我没有看到实现自己的UIScrollView的子类的原因,如果你坚持这样做,不要阴影它的.delegate属性或确保并调用超级。

假设所有这些scrollviews的其他一些观点载;:

我会通过执行以下处理这个

UIScrollView *a = .... 
a.delegate = self; 
a.tag = 1; 

UIScrollView *b = .... 
b.delegate = self; 
b.tag = 2; 

UIScrollView *c = .... 
c.delegate = self; 
c.tag = 3 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (scrollView.tag == 1) 
    //handle a 
    else if (scrollView.tag == 2) 
    //handle b 
    else if (scrollView.tag == 3) 
    //handle c 
} 
+0

** 1)为什么我的子类UIScrollView?**这是一个相对复杂的类,只有三个UIViews声明在无限循环中显示许多图像。它可以全部在视图控制器中完成,但是这种方式我保存了不少if(scrollView.tag == 1)else if(scrollView == 2)else ..' 很多次。 – coco 2011-04-22 18:59:58

+0

** 2)**是的,(现在)明显的答案是,父视图控制器应该是委托,而不是子滚动视图。这使一切都很容易。谢谢,还有JAgostoni – coco 2011-04-22 19:00:43