2010-10-22 15 views
63

Mi proyecto tiene una función de categoría UIImage que quiero llamar desde otra clase. Importe correctamente el archivo de encabezado para la categoría de imagen y obtengo el proyecto para compilar sin advertencia.Categoría Objective-C Causando el selector no reconocido

El problema es que cuando llamo a la función de categoría UIImage vi un error de selector no reconocido con un NSInvalidArgumentException. ¿Por qué estoy viendo esto si he vinculado todo correctamente?

#import <UIKit/UIKit.h> 

@interface UIImage (DRShare) 

+ (UIImage*) imageNamed:(NSString*)name; 

@end 


@implementation UIImage (DRShare) 

+ (UIImage*) imageNamedDR:(NSString*)name{ 

    CGFloat s = 1.0f; 
    if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){ 
     s = [[UIScreen mainScreen] scale]; 
    } 

    NSString *path = [NSString stringWithFormat:@"%@%@%@.png",kImagesPath,name,s > 1 ? @"@2x":@""]; 
    return [UIImage imageWithContentsOfFile:DRBUNDLE(path)]; 
} 

@end 

archivo que llama:

 backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup Background"]]; 

excepción planteada:

2010-10-22 11:51:02.880 Stuff[11432:207] +[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938 
2010-10-22 11:51:02.883 Stuff[11432:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x02e65b99 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x02fb540e objc_exception_throw + 47 
    2 CoreFoundation      0x02e6776b +[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x02dd72b6 ___forwarding___ + 966 
    4 CoreFoundation      0x02dd6e72 _CF_forwarding_prep_0 + 50 
    5 TapTapShare       0x0001291c -[DRShareViewController backgroundView] + 127 
    6 TapTapShare       0x00-[DRShareViewController loadView] + 639 
    7 UIKit        0x0044f54f -[UIViewController view] + 56 
    8 UIKit        0x0044d9f4 -[UIViewController contentScrollView] + 42 
    9 UIKit        0x0045d7e2 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48 
    10 UIKit        0x0045bea3 -[UINavigationController _layoutViewController:] + 43 
    11 UIKit        0x0045d12d -[UINavigationController _startTransition:fromViewController:toViewController:] + 524 
    12 UIKit        0x00457ccd -[UINavigationController _startDeferredTransitionIfNeeded] + 266 
    13 UIKit        0x00574b55 -[UILayoutContainerView layoutSubviews] + 226 
    14 QuartzCore       0x02616481 -[CALayer layoutSublayers] + 177 
    15 QuartzCore       0x026161b1 CALayerLayoutIfNeeded + 220 
    16 QuartzCore       0x026160bd -[CALayer layoutIfNeeded] + 111 
+1

proporcione el código y Detalles de la excepción. Es completamente imposible responder sin eso. –

+0

La declaración de 'imageNamedTT:' sería útil también. –

+1

¿Podría ser que su instancia sea en realidad una clase diferente? –

Respuesta

198

Un par de posibilidades:

  1. Usted no vinculó UIImage+TTShare.m en su objetivo. Entonces, mientras tiene el encabezado, no está compilando la implementación.
  2. Si esto es parte de una biblioteca estática, debe agregar -all_load a Configuración de compilación Other Linker Flags para la aplicación que enlaza con la biblioteca.
+0

Para el registro, creo que arruiné mi objetivo de biblioteca estática. – devinross

+2

+1 ¡Gracias, solo necesito la pista que se proporciona en el n. ° 1! – bentford

+23

Gracias por señalar el problema con las bibliotecas estáticas. http://developer.apple.com/library/mac/#qa/qa1490/_index.html tiene más información. Para que quede claro, debe agregar ese indicador a los indicadores del vinculador de la aplicación que incluye la biblioteca estática, no al compilar la biblioteca estática. –

4

Tuve el mismo problema y tuve que aplicar esta solución también. Mi archivo fuente NSDate-Extensions.m no se estaba compilando, así que tuve que entrar en Configuración del proyecto, luego seleccionar el objetivo apropiado, luego hacer clic en la pestaña "Crear fases", luego expandir los elementos "Compilar fuentes", luego hacer clic en + símbolo y agregue manualmente mi archivo NSDate-Extensions.m.

0

Tuve este mensaje de error y estoy usando Cocoapods. Para arreglar el error, solo necesitaba llamar al pod install nuevamente para crear todos los enlaces necesarios correctamente.

6

Si desea utilizar el método de categoría, debe agregar -ObjC a la configuración de compilación de otros enlaces de su aplicación.

0

Otra posibilidad.

Tiene la implementación de la categoría pero no tiene una interfaz. Quiero decir que olvidó declarar en * .h la interfaz de su categoría.

0

Sin embargo, otra posibilidad:

Esto es casi demasiado embarazoso admitir, pero por si acaso alguien podría haber hecho lo mismo error tonto:

estaba copiando el código de un proyecto a otro, y por error Había pegado el mismo código fuente en el archivo .h y el archivo .m (en ambos había puesto el código destinado al archivo .h). Arreglé mi archivo .m y funcionó.

0

puede deberse a que se escribe en lugar de imageNamedimageNamedDR en la interfaz ..

Cuestiones relacionadas