Shared UITableViewDelegate
Ich schreibe eine Unterklasse von UITableView und möchte, dass meine Unterklasse einige der UITableViewDelegate-Methoden selbst handhabt, bevor sie sie an den "echten" Delegaten weiterleitet sowie alle UITableViewDelegate-Methoden weiterleitet, die nicht von meiner Unterklasse implementiert wurden.
In der Unterklasse habe ich ein Privateigentum:
@property (nonatomic, assign) id <UITableViewDelegate> trueDelegate;
Das ist der "echte Delegat", an den sich alle nicht implementierten Methoden wenden sollten. In meinen beiden Init-Methoden setze ich
self.delegate = self;
und ich überschreibe - (void) setDelegate: (id) so
-(void)setDelegate:(id<UITableViewDelegate>)delegate {
if (delegate != self) {
_trueDelegate = delegate;
} else {
[super setDelegate:self];
}
}
Dann überschreibe ich diese, um die Nachrichtenweiterleitung zu handhaben
-(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];
}
}
Das Problem besteht darin, dass die nicht implementierten Delegatmethoden in der Tabellenansicht nie aufgerufen werden und daher keine Chance haben, an das _trueDelegate-Objekt weitergeleitet zu werden.
Ich habe versucht, nach ihnen zu suchen:
- (BOOL)respondsToSelector:(SEL)aSelector {
}
Diese Methode wird jedoch nie für die UITableViewDelegate-Methoden aufgerufen, obwohl andere Methoden problemlos abgefangen werden können.