UIScrollView实现委托

时间:2011-04-20 19:49:24

标签: objective-c delegates uiscrollview uiscrollviewdelegate

我有一个视图控制器,它有三个滚动视图作为子视图。我希望孩子滚动视图在页面发生变化时通知父视图控制器。

我以为我会通过设置委托模式来做到这一点。我的孩子(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:都没有被调用!这意味着我已经失去了对滚动视图的控制权。

我做错了吗?或者,子视图是否有更好的方式将消息发送回父母?

1 个答案:

答案 0 :(得分:0)

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

我会通过以下方式来解决这个问题:

假设所有这些滚动视图都包含在其他视图中;

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
}