Я думаю, что это близко к шаблону декоратора:
ИСПОЛЬЗОВАНИЕ:
DecoratorSample* _decorator = [[DecoratorSample alloc] init];
_decorator.scrollView = self.tableView; // or any other class derived from UIScrollView
[_decorator.scrollView addSubview:_decorator];
[_decorator release];
Таким образом tableView будет продолжать реагировать на события TableView и дополнительно на события ScrollView от _decorator
MENTION: _decorator может быть получен из любого класса, который реализует UIScrollViewDelegate
Я думаю, что это похоже на UINavigationController или UITabbarController, которые, на мой взгляд, очень близки к шаблону декоратора.Вероятно, вы не можете сделать это со всеми типами объектов, но это работает с типом вещей UIView.Также проверьте книгу "Образцы дизайна какао" для некоторых вкусных образцов Какао.К сожалению, то, что я нашел относительно декоратора, мало.
@interface DecoratorSample : UIScrollView <UIScrollViewDelegate>
{
UIScrollView* _scrollView;
id<UIScrollViewDelegate> _forwardDelegate;
}
@property (nonatomic,assign) id<UIScrollViewDelegate> forwardDelegate;
@property (nonatomic,retain) UIScrollView* scrollView;
@end
и:
@implementation DecoratorSample
@synthesize forwardDelegate = _forwardDelegate;
- (void)dealloc
{
[_scrollView release];
}
- (void) setScrollView:(UIScrollView*)scrollView
{
[_scrollView release];
_scrollView = scrollView;
[_scrollView retain];
_forwardDelegate = _scrollView.delegate;
_scrollView.delegate = self;
}
- (UIScrollView*) scrollView
{
return _scrollView;
}
#pragma UIScrollView implementation
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
if (_forwardDelegate != nil && [_forwardDelegate respondsToSelector:@selector(scrollViewWillBeginDragging:)])
{
[_forwardDelegate scrollViewWillBeginDragging:scrollView];
}
//do something else
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (_forwardDelegate != nil && [_forwardDelegate respondsToSelector:@selector (scrollViewDidScroll:)])
{
[_forwardDelegate scrollViewDidScroll:scrollView];
}
//do something else
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (_forwardDelegate != nil && [_forwardDelegate respondsToSelector:@selector(scrollViewDidEndDragging:willDecelerate:)])
{
[_forwardDelegate scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}
//do something else
}
@end