Из любопытства можно вызвать первоначальную реализацию метода делегата в пользовательской реализации делегата. как [super delegateMethod]; Или это невозможно. Есть несколько сценариев, где id хотел бы добавить настройки к поведению, если выполняются определенные условия. Заранее спасибо!Можно ли вызвать делегата из делегата?
0
A
ответ
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;
О, как интересно! Я бы не подумал обернуть класс в другом классе, но это имеет большой смысл. Спасибо! – CoderNinja