it-swarm.com.de

Objective-C-Kategorie Ursache für nicht erkannten Selektor

Mein Projekt hat eine UIImage-Kategoriefunktion, die ich von einer anderen Klasse aufrufen möchte. Ich importiere die Header-Datei für die Image-Kategorie ordnungsgemäß und ich kann das Projekt ohne Warnung kompilieren.

Das Problem ist, dass beim Aufruf der Kategoriefunktion UIImage ein nicht erkannter Selektorfehler mit einer NSInvalidArgumentException angezeigt wurde. Warum sehe ich das, wenn ich alles richtig verlinkt habe?

#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

datei, die es nennt:

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

ausnahme ausgelöst:

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

Ein paar Möglichkeiten:

  1. Sie haben UIImage+TTShare.m nicht in Ihr Ziel verlinkt. Wenn Sie also den Header haben, kompilieren Sie die Implementierung nicht.
  2. Wenn dies Teil einer statischen Bibliothek ist, müssen Sie der Other Linker Flags build-Einstellung -all_load für die Verknüpfung der App mit der Bibliothek hinzufügen.
205
Dave DeLong

Wenn Sie die Category-Methode verwenden möchten, müssen Sie der Build-Einstellung Other Linker Flags Ihrer App -ObjC hinzufügen.

8
ling

Ich hatte das gleiche Problem und musste dieses Update ebenfalls anwenden. Meine NSDate-Extensions.m-Quelldatei wurde nicht kompiliert. Daher musste ich in die Projekteinstellungen gehen, das entsprechende Ziel auswählen und dann auf "Build Phases "Erweitern Sie die Registerkarte" Compile Sources ", klicken Sie auf das Symbol + und fügen Sie meine NSDate-Extensions.m-Datei manuell hinzu.

6
Clive Paterson

Möglicherweise, weil Sie imageNamed anstelle von imageNamedDR in die Schnittstelle schreiben.

0
Hlung

Ich hatte diese Fehlermeldung und verwende Cocoapods. Um den Fehler zu beheben, musste ich lediglich pod install erneut aufrufen, um alle erforderlichen Verknüpfungen korrekt zu erstellen.

0
H6.

Noch eine andere Möglichkeit:

Das ist fast zu peinlich, um zugeben zu können, aber nur für den Fall, dass jemand den gleichen dummen Fehler gemacht hätte:

Ich habe Code von einem Projekt in ein anderes kopiert, und aus Versehen hatte ich denselben Quellcode in die .h-Datei und die .m-Datei eingefügt (in beiden hatte ich den für die .h-Datei vorgesehenen Code eingefügt). Ich habe meine .m-Datei repariert und es hat funktioniert.

0

Andere Möglichkeit.

Sie haben die Implementierung von category, aber keine Schnittstelle. Ich meine, Sie haben vergessen, in * .h die Schnittstelle Ihrer Kategorie anzugeben.

0
Voda Ion