私はUITableViewのサブクラスを作成しています。サブクラスで実装されていないすべてのUITableViewDelegateメソッドを転送する前に、実際のデリゲートに渡す前にUITableViewDelegateメソッドのいくつかを処理するようにします。私は私有財産を持つサブクラスで共有UITableViewDelegate
:
すべて実装されていないメソッドがに転送すべき「本当のデリゲート」を保持します。両方とも私のinitメソッドでは、私は
self.delegate = self;
を設定し、私は上書き - (無効)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];
}
}
問題は、実装されていないデリゲートメソッドがtableviewで呼び出されることはないため、_trueDelegateオブジェクトに転送される機会が与えられていないことです。
私はここでそれらをチェックしてみました:
- (BOOL)respondsToSelector:(SEL)aSelector {
}
が、それはうまく他の方法をキャッチが、その方法は、UITableViewDelegate法のために呼び出されることはありません。
デリゲートプロトコルに準拠して拡張クラスを宣言しましたか? –
私は、delegateメソッドを呼び出すときにtableViewが 'respondsToSelector:'の代わりに 'conformsToProtocol:'を使用する可能性があるので尋ねます。 –
本当に私は、非常によく問題になる可能性がある、私はそれをチェックします – Lance