Mon projet a une fonction de catégorie UIImage
que je souhaite appeler depuis une autre classe. J'importe correctement le fichier d'en-tête de la catégorie d'image et le projet est compilé sans avertissement.
Le problème est que, lorsque j'appelle la fonction de catégorie UIImage
, j'ai constaté une erreur de sélecteur non reconnue avec un NSInvalidArgumentException
. Pourquoi est-ce que je vois cela si j'ai tout lié correctement?
#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
fichier qui l'appelle:
backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup Background"]];
exception levée:
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 0x00012343 -[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
Quelques possibilités:
UIImage+TTShare.m
à votre cible. Ainsi, tant que vous avez l’en-tête, vous ne compilez pas l’implémentation.-all_load
au paramètre Autres drapeaux de l'éditeur de liens build pour l'application liée à la bibliothèque.Si vous souhaitez utiliser la méthode Category, vous devez ajouter -ObjC au paramètre de construction Other Linker Flags de votre application.
J'avais le même problème et devais également appliquer ce correctif . Mon fichier source NSDate-Extensions.m n'étant pas compilé, je devais accéder aux paramètres du projet, puis sélectionner la cible appropriée, puis cliquer sur le bouton "Construire les phases "onglet, puis développez les éléments" Compiler les sources ", puis cliquez sur le symbole + et ajoutez manuellement mon fichier NSDate-Extensions.m.
Peut-être parce que vous écrivez imageNamed
au lieu de imageNamedDR
dans l'interface ..
J'ai eu ce message d'erreur et j'utilise des cocoapodes. Pour corriger l'erreur, il me suffisait de rappeler pod install
pour créer correctement tous les liens nécessaires.
Encore une autre possibilité:
C'est presque trop embarrassant pour l'admettre, mais juste au cas où quelqu'un aurait pu faire la même erreur stupide:
Je copiais du code d'un projet à un autre et, par erreur, j'avais collé le même code source dans les fichiers .h
et .m
(dans les deux cas j'avais mis le code destiné au fichier .h
). J'ai corrigé mon fichier .m
et cela a fonctionné.
Une autre possibilité.
Vous avez l'implémentation de category mais n'avez pas d'interface. Je veux dire que vous avez oublié de déclarer en * .h l’interface de votre catégorie.