2012-07-19 31 views
0

我想要做的是。讓一個tableView繼承自定義scrollview委託

  1. 覆蓋滾動視圖的委託方法(例如,scrollViewDidEndDragging)
  2. 使用它爲我的滾動視圖&的tableView

我現在有什麼,

  1. MyScrollView的委託將覆蓋scrollViewDidEndDragging
  2. MySuperTableViewController(UITableView的子類)重寫了scrollVie wDidEndDragging,讓MySuperTableViewController

顯然,同樣的scrollViewDidEndDragging代碼被複制在兩個地方MyChildTableViewController子,我怎麼可以將代碼放在一個地方,分享嗎?

下面是我想分享我的滾動視圖和的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 
+0

威力最好發佈一些代碼。 – danh 2012-07-19 04:12:19

+0

@danh:添加了一些代碼。 – eugene 2012-07-19 04:19:27

+0

我現在明白了。謝謝。 – danh 2012-07-19 04:29:48

回答

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]; 
    } 
}