2011-08-31 22 views
5

Ho un piccolo enigma che mi sta facendo impazzire. Uso la delega in modo piuttosto pesante come uno schema in un'applicazione che sto scrivendo. Sto cercando di essere "attento" nel codice chiamando il delegato il più possibile testando il delegato con "[delegate respondsToSelector]" su ogni chiamata delegata. Tutto funziona bene a meno che non sia in una sottoclasse UIView. In tal caso, respondsToSelector restituisce NO, ma posso tranquillamente chiamare il codice delegato così chiaramente esiste e funziona correttamente.Perché respondsToSelector non funziona per me in questo caso?

L'ho ridotto all'esempio più semplice che riesco di seguito. Qualsiasi aiuto è possibile fornire sarebbe apprezzato:

All'interno del file h mia UIView di sottoclasse:

#import <UIKit/UIKit.h> 

@protocol TestDelegate <NSObject> 
@optional 
-(double)GetLineWidth; 
@end 

@interface ViewSubclass : UIView { 
    id<TestDelegate> delegate; 
} 

@property (nonatomic, retain) id<TestDelegate> delegate; 

@end 

All'interno file h della mia classe delegato:

#import <Foundation/Foundation.h> 
#import "ViewSubclass.h" 

@interface ViewDelegate : NSObject <TestDelegate> { 

} 

@end 

All'interno .m della mia classe delegato File:

#import "ViewDelegate.h" 

@implementation ViewDelegate 

-(double)GetLineWidth { 
    return 25.0; 
} 

@end 

All'interno del file .m mia UIView di sottoclasse:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    double lineWidth = 2.0; 

    if (delegate == nil) { 
     ViewDelegate *vd = [[ViewDelegate alloc]init]; 
     delegate = vd; 
    } 

    // If I comment out the "if" statement and just call the delegate 
    // delegate directly, the call works! 
    if ([delegate respondsToSelector:@selector(GetLineWidth:)]) { 
     lineWidth = [delegate GetLineWidth]; 
    } 

    CGContextSetLineWidth(context, lineWidth); 
+0

In genere non si vuole mantenere delegati '@property (nonatomic, assegnare) id delegato;' – slf

+1

Cosa disse Rob ; quel metodo dovrebbe essere chiamato 'lineWidth'. I metodi non dovrebbero mai iniziare con lettere maiuscole e dovrebbero iniziare solo con 'get' in circostanze molto rare. Questa non è una scelta di stile, questo è un modello che devi seguire affinché tutte le funzionalità del framework funzionino correttamente. – bbum

risposta

14

il selettore per -(double)GetLineWidth è @selector(GetLineWidth).

si dispone di due punti in più nel selettore.

if ([delegate respondsToSelector:@selector(GetLineWidth:)]) { 
                ^
+0

Ok, tu eri il primo =) – Nekto

+5

E rinomina 'GetLineWidth' in' lineWidth'. Non accedere alle preferenze con "Get" e non iniziare con un cap leader. È importante in Cocoa, non è solo una scelta di stile. –

+0

Doh! Grazie a tutti! – user704315

3

Sostituire se-dichiarazione con questo:

if ([delegate respondsToSelector:@selector(GetLineWidth)]) { 
    lineWidth = [delegate GetLineWidth]; 
} 
Problemi correlati