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
Ein paar Möglichkeiten:
UIImage+TTShare.m
nicht in Ihr Ziel verlinkt. Wenn Sie also den Header haben, kompilieren Sie die Implementierung nicht.-all_load
für die Verknüpfung der App mit der Bibliothek hinzufügen.Wenn Sie die Category-Methode verwenden möchten, müssen Sie der Build-Einstellung Other Linker Flags Ihrer App -ObjC hinzufügen.
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.
Möglicherweise, weil Sie imageNamed
anstelle von imageNamedDR
in die Schnittstelle schreiben.
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.
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.
Andere Möglichkeit.
Sie haben die Implementierung von category, aber keine Schnittstelle. Ich meine, Sie haben vergessen, in * .h die Schnittstelle Ihrer Kategorie anzugeben.