0

我想做的是。

  1. 覆盖 scrollView 的委托方法(例如,scrollViewDidEndDragging)
  2. 将它用于我的 scrollView 和 tableView

我现在拥有的是,

  1. MyScrollView 的委托覆盖 scrollViewDidEndDragging
  2. MySuperTableViewController(UITableView 的子类)覆盖scrollViewDidEndDragging,并让MyChildTableViewController 子类化MySuperTableViewController

显然,相同的 scrollViewDidEndDragging 代码在两个地方重复,我如何将代码放在一个地方并共享它?

以下是我想为我的 scrollView 和 tableView 分享的代码

#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 回答