2012-07-13 14 views
6

UITableView alt sınıfını yazıyorum ve alt sınıfımın, alt sınıfım tarafından uygulanmayan tüm UITableViewDelegate yöntemlerini iletmek için "gerçek" temsilci boyunca iletmeden önce UITableViewDelegate yöntemlerinin bir kısmını kendisinin işlemesini istiyorum. tüm uygulanmayan yöntemler yönlendirsin "gerçek temsilci" tutanPaylaşılan UITableViewDelegate

: alt sınıfında

Ben özel bir özelliği vardır. hem benim init yöntemde de ben
self.delegate = self; 

set ve geçersiz - (void) setDelegate: (id) bu

-(void)setDelegate:(id<UITableViewDelegate>)delegate { 
    if (delegate != self) { 
     _trueDelegate = delegate; 
    } else { 
     [super setDelegate:self]; 
    } 
} 

gibi Sonra ileti yönlendirmeyi işlemek için bu geçersiz

-(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]; 
    } 
} 

Sorun, henüz kullanılmayan temsilci yöntemlerinin hiçbir zaman tablo görünümüne çağrılmamasıdır, bu nedenle _trueDelegate nesnesine iletilmeleri için bir şans verilmez.

Burada onlar için denetimi çalıştı:

- (BOOL)respondsToSelector:(SEL)aSelector { 

} 

ama gayet güzel başka yöntemler yakalar rağmen bu yöntem UITableViewDelegate yöntemleri için hiçbir zaman denir.

+0

Genişletilmiş sınıfınızı temsilci protokollerine uygun olarak bildirdiniz mi? –

+0

Soruyorum çünkü tableView, temsilci yöntemlerini çağırırken "responsesToSelector:" yerine "conformsToProtocol:" işlevini kullanıyor olabilir. –

+0

Gerçekten yaptım, bu çok iyi bir sorun olabilir, ben kontrol edeceğim – Lance

cevap

12

Performans için, UITableView delegenin ayarlandığı anda hangi temsilci yöntemlerinin kullanılabileceğini kontrol eder ve hatırlar. Önce self temsilcisini, ardından trueDelegate'u ayarlayın. Bu nedenle, temsilci UITableView üzerinde ayarlandığında, trueDelegatenil ve -respondsToSelector: bunun için NO döndürür.

Bunu düzeltmek için, trueDelegate ayarlandıktan sonra delegeyi ayarlayın. Ayrıca, yönlendirme kodunu basitleştirebilirsiniz. Özellik dışında yukarıdaki tüm kodları kaldırın ve yerine aşağıdakiyle değiştirin:

- (void)setDelegate:(id <UITableViewDelegate>)delegate 
{ 
    if (delegate == self) return; 

    self.trueDelegate = delegate; 
    [super setDelegate:self]; 
} 

- (BOOL)respondsToSelector:(SEL)aSelector 
{ 
    if ([super respondsToSelector:aSelector]) return YES; 

    return [self.trueDelegate respondsToSelector:aSelector]; 
} 

- (id)forwardingTargetForSelector:(SEL)aSelector 
{ 
    return self.trueDelegate; 
} 
+0

Teşekkürler! Bu mükemmel, sadece meraklı, belirtilen UITableView optimizasyonu hakkında nasıl bildin? – Lance

+0

Delegelerin doğru şekilde uygulanmasına baktığımda bir süre önce tökezledim. UITableView.h dosyasındaki "_tableFlags", UITableView’un hangi yöntemlerin delege/veri kaynağında uygulandığını oldukça iyi bir ipucu verir. –

+1

Harika cevap, ipucunu alana kadar her şeyi denedim. –