1

サブビューとして 3 つのスクロール ビューを持つビュー コントローラーがあります。ページが変更されるたびに、子スクロール ビューが親ビュー コントローラーに通知するようにしたいと考えています。

委任パターンを設定することでこれを行うと思いました。私の子供 (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;
}

.. したがって、2 つのメソッドscrollViewDidScroll:scrollViewDidEndDecelerating:が呼び出されません! これは、スクロール ビューを制御できなくなったことを意味します。

私はこれを間違ってやっていますか?または、子サブビューがメッセージを親に送り返すためのより良い方法はありますか?

4

1 に答える 1

0

私は問題全体を理解していないかもしれませんが、UIScrollView の独自のサブクラスを実装する理由がわかりません。そうすることに固執している場合は、.delegate プロパティを隠したり、スーパーを呼び出したりしないでください。

私は次のようにしてこれに取り組みます:

これらのスクロールビューのすべてが他のビューに含まれていると仮定します。

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
}
于 2011-04-20T21:25:39.450 に答える