Я пишу подкласс UITableView и хочу, чтобы мой подкласс сам обрабатывал некоторые методы UITableViewDelegate, прежде чем передавать их «настоящему» делегату, а также пересылал все методы UITableViewDelegate, не реализованные моим подклассом.
В подклассе у меня есть частная собственность:
@property (nonatomic, assign) id <UITableViewDelegate> trueDelegate;
который содержит «настоящего делегата», которому должны перенаправляться все нереализованные методы. В обоих моих методах инициализации я установил
self.delegate = self;
и я отвергаю-(void )setDelegate :(id )вот так
-(void)setDelegate:(id<UITableViewDelegate>)delegate {
if (delegate != self) {
_trueDelegate = delegate;
} else {
[super setDelegate:self];
}
}
Затем я переопределяю их для обработки пересылки сообщений
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
NSMethodSignature *sig;
sig = [[self.delegate class] instanceMethodSignatureForSelector:aSelector];
if (sig == nil) {
sig = [NSMethodSignature signatureWithObjCTypes:"@^v^c"];
}
return sig;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
SEL selector = anInvocation.selector;
if ([self respondsToSelector:selector]) {
[anInvocation invokeWithTarget:self];
} else {
[anInvocation invokeWithTarget:_trueDelegate];
}
}
. Проблема в том, что нереализованные методы делегата никогда не вызываются в табличном представлении, поэтому им не дается шанс быть перенаправленным вместе с объектом _trueDelegate.
Я пытался найти их здесь:
- (BOOL)respondsToSelector:(SEL)aSelector {
}
но этот метод никогда не вызывается для методов UITableViewDelegate, хотя он отлично ловит другие методы.