2015-01-30 3 views
0

Из любопытства можно вызвать первоначальную реализацию метода делегата в пользовательской реализации делегата. как [super delegateMethod]; Или это невозможно. Есть несколько сценариев, где id хотел бы добавить настройки к поведению, если выполняются определенные условия. Заранее спасибо!Можно ли вызвать делегата из делегата?

ответ

1

Да, это может быть достигнуто с помощью объекта-обертки, который перехватывает сообщения и пересылает их другому объекту-делегату. Следующий класс перехватывает вызовы метода scrollViewDidScroll: перед тем, как перенаправить его (и любые другие вызовы метода делегата) в другой UIScrollViewDelegate.

@import UIKit; 

@interface ScrollHandler : NSObject <UIScrollViewDelegate> 
- (instancetype)initWithScrollViewDelegate:(id<UIScrollViewDelegate>)delegate; 
@end 

@implementation ScrollHandler { 
    id<UIScrollViewDelegate> _scrollViewDelegate; 
} 

- (instancetype)initWithScrollViewDelegate:(id<UIScrollViewDelegate>)delegate { 
    self = [super init]; 
    if (self) { 
     _scrollViewDelegate = delegate; 
    } 
    return self; 
} 

// Intercept specific method invocations: 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    // Implement custom behavior here before forwarding the invocation to _scrollViewDelegate 
    [_scrollViewDelegate scrollViewDidScroll:scrollView]; 
} 

// Forward unintercepted method invocations: 

- (BOOL)respondsToSelector:(SEL)selector 
{ 
    // Ask _scrollViewDelegate if it responds to the selector (and ourself as well) 
    return [_scrollViewDelegate respondsToSelector:selector] || [super respondsToSelector:selector]; 
} 

- (void)forwardInvocation:(NSInvocation *)invocation 
{ 
    // Forward the invocation to _scrollViewDelegate 
    [invocation invokeWithTarget:_scrollViewDelegate]; 
} 

@end 

Пример использования:

_scrollView = [[ScrollHandler alloc] init]; 
_scrollController = [[ScrollHandler alloc] initWithScrollViewDelegate:self]; 
_scrollView.delegate = _scrollController; 
+0

О, как интересно! Я бы не подумал обернуть класс в другом классе, но это имеет большой смысл. Спасибо! – CoderNinja