2011-08-31 24 views
5

Tengo un pequeño enigma que me está conduciendo hasta la pared. Estoy usando delegación bastante como un patrón en una aplicación que estoy escribiendo. Estoy tratando de ser tan "cuidadoso" en el código llamando al delegado como puedo probando al delegado con "[delegarrespondsToSelector]" en cada llamada delegada. Todo funciona bien a menos que esté en una subclase de UIView. En ese caso, respondsToSelector devuelve NO pero puedo llamar al código de delegado con tanta claridad que existe y funciona correctamente.¿Por qué respondsToSelector no funciona para mí en este caso?

He reducido al ejemplo más simple que puedo a continuación. Cualquier ayuda que puede proporcionar sería apreciada:

Dentro del archivo .h mi UIView de subclase:

#import <UIKit/UIKit.h> 

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

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

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

@end 

Dentro archivo .h de mi clase delegada:

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

@interface ViewDelegate : NSObject <TestDelegate> { 

} 

@end 

Dentro .m de mi clase de delegado archivo:

#import "ViewDelegate.h" 

@implementation ViewDelegate 

-(double)GetLineWidth { 
    return 25.0; 
} 

@end 

Dentro archivo .m mi UIView subclase de:

- (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

Normalmente, usted no querrá conservar delegados '@property id (, ceder no atómica) delegado;' – slf

+1

lo que Rob Said ; ese método debería llamarse 'lineWidth'. Los métodos nunca deben comenzar con letras mayúsculas y solo deben comenzar con 'get' en circunstancias muy raras. Esta no es una opción de estilo, este es un patrón que debe seguir para que todas las funciones del marco funcionen correctamente. – bbum

Respuesta

14

el selector para -(double)GetLineWidth es @selector(GetLineWidth).

tiene dos puntos adicionales en su selector.

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

Ok, primero =) – Nekto

+5

Y cambie el nombre 'GetLineWidth' por' lineWidth'. No acceda a los usuarios con "Obtener" y no lo haga para comenzar con un límite máximo. Es importante en Cocoa, no es solo una elección de estilo. –

+0

¡Doh! ¡Gracias a todos! – user704315

3

Reemplazar sentencia if con éste:

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