0

私がやりたいことは。

  1. scrollView のデリゲート メソッドをオーバーライドする (例: scrollViewDidEndDragging)
  2. 私のscrollViewとtableViewに使用します

私が今持っているのは、

  1. MyScrollView のデリゲートは scrollViewDidEndDragging をオーバーライドします
  2. MySuperTableViewController (UITableView のサブクラス) は scrollViewDidEndDragging をオーバーライドし、MyChildTableViewController が MySuperTableViewController をサブクラス化できるようにします

どうやら、同じ scrollViewDidEndDragging コードが 2 か所に重複しているようですが、コードを 1 か所に配置して共有するにはどうすればよいですか?

以下は、スクロールビューとテーブルビューで共有したいコードです

#import "OverlayTableViewController.h"


@interface OverlayTableViewController()
{
CADisplayLink *_displayLink;
}
@end

@implementation OverlayTableViewController

-(void)scrollViewWillBeginDragging:(UIScrollView*)scrollView
{
    [self startDisplayLinkIfNeeded];
}


- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView willDecelerate:(BOOL)decelerate
{
    if(!decelerate)
        [self stopDisplayLink];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self stopDisplayLink];
}


- (void)startDisplayLinkIfNeeded
{
    if(!_displayLink)
    {
        _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(display)];
        [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];
    }
}

- (void)stopDisplayLink
{
    [_displayLink invalidate];
    _displayLink = nil;
}

- (void)display
{
    //
}

@end
4

1 に答える 1

0

CommonScrollViewDelegateのようなものと呼んで、すべての一般的なデリゲートロジックを新しいものに入れる最良の方法だと思います。displayLinkTargetのようなプロパティと、それを使用するクラスにカスタムであるその他のプロパティが必要になる場合があります。

これらのクラスはいずれも、スクロールデリゲートを次のように設定できます。

CommonScrollViewDelegate *commonDelegate = [[CommonScrollViewDelegate alloc] init];

commonDelegate.displayLinkTarget = self; // or add this to the init method if you want
myScrollView.delegate = commonDelegate;

次に、CommonScrollViewDelegateのコードは基本的に同じままですが、次のような小さな調整が加えられています。

@property(strong, nonatomic) id displayLinkTarget;
// etc.
@synthesize displayLinkTarget = _displayLinkTarget;

- (void)startDisplayLinkIfNeeded
{
    if(!_displayLink)
    {
        _displayLink = [CADisplayLink displayLinkWithTarget:self.displayLinkTarget
                                                   selector:@selector(display)];
        [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];
    }
}
于 2012-07-19T04:36:50.720 に答える