web-dev-qa-db-fra.com

Catégorie Objective-C provoquant un sélecteur non reconnu

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
66
devinross

Quelques possibilités:

  1. Vous n'avez pas lié UIImage+TTShare.m à votre cible. Ainsi, tant que vous avez l’en-tête, vous ne compilez pas l’implémentation.
  2. S'il s'agit d'une bibliothèque statique, vous devez ajouter -all_load au paramètre Autres drapeaux de l'éditeur de liens build pour l'application liée à la bibliothèque.
205
Dave DeLong

Si vous souhaitez utiliser la méthode Category, vous devez ajouter -ObjC au paramètre de construction Other Linker Flags de votre application.

8
ling

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.

6
Clive Paterson

Peut-être parce que vous écrivez imageNamed au lieu de imageNamedDR dans l'interface ..

0
Hlung

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.

0
H6.

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é.

0

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.

0
Voda Ion