让tableView继承自定义scrollview委托

时间:2012-07-19 04:07:11

标签: iphone ios uitableview uiscrollview

我想做的是。

  1. 覆盖scrollView的委托方法(例如,scrollViewDidEndDragging)
  2. 将它用于我的scrollView& tableView
  3. 我现在拥有的是,

    1. MyScrollView的委托覆盖scrollViewDidEndDragging
    2. MySuperTableViewController(UITableView的子类)覆盖scrollViewDidEndDragging,让MyChildTableViewController子类MySuperTableViewController
    3. 显然,同一个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
      

1 个答案:

答案 0 :(得分: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];
    }
}