Mein Projekt hat eine UIImage
Kategoriefunktion, die ich aus einer anderen Klasse aufrufen möchte. Ich importiere die Header-Datei für die Bildkategorie ordnungsgemäß und lasse das Projekt ohne Warnung kompilieren.
Das Problem ist, dass beim Aufrufen der UIImage
Kategoriefunktion ein nicht erkannter Auswahlfehler mit a aufgetreten ist NSInvalidArgumentException
. Warum sehe ich das, wenn ich alles richtig verknüpft 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 aufruft:
backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup Background"]];
Ausnahme:
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
iphone
objective-c
cocoa
categories
Devinross
quelle
quelle
imageNamedTT:
wäre auch nützlich.imageNamed: and then the implementation for
imageNamedDR deklariert : `aber diese Methode ist nicht im Header deklariert. (Offensichtlich alt und Sie haben das Problem wahrscheinlich inzwischen behoben). War dies nur ein Tippfehler oder ein tatsächliches Problem?Antworten:
Ein paar Möglichkeiten:
UIImage+TTShare.m
zu Ihrem Ziel hergestellt. Während Sie also den Header haben, kompilieren Sie die Implementierung nicht.-all_load
, die mit der Bibliothek verknüpft ist.quelle
-all_load
in den Build - Einstellungen von der Client - Anwendung , nicht , wenn die statische Bibliothek richtigen Gebäude? Das hat bei mir funktioniert.-all_load
sicher, dass nur das Hinzufügen-ObjC
das Problem behebt. Alle Ladevorgänge erhöhen die Größe der ausführbaren Datei unnötig.Wenn Sie die Category-Methode verwenden möchten, müssen Sie -ObjC zur Build-Einstellung Other Linker Flags Ihrer APP hinzufügen.
quelle
Ich hatte das gleiche Problem und musste dieses Update auch anwenden. Meine Quelldatei NSDate-Extensions.m wurde nicht kompiliert, daher musste ich in die Projekteinstellungen gehen, das entsprechende Ziel auswählen, auf die Registerkarte "Phasen erstellen" klicken, die Elemente "Quellen kompilieren" erweitern und dann auf das Symbol + klicken und füge meine NSDate-Extensions.m-Datei manuell hinzu.
quelle
Ich hatte diese Fehlermeldung und verwende Cocoapods. Um den Fehler zu beheben, musste ich nur
pod install
erneut aufrufen , um alle erforderlichen Verknüpfungen korrekt zu erstellen.quelle
Andere Möglichkeit.
Sie haben die Implementierung der Kategorie, aber keine Schnittstelle. Ich meine, Sie haben vergessen, in * .h die Schnittstelle Ihrer Kategorie zu deklarieren.
quelle
Noch eine Möglichkeit:
Das ist fast zu peinlich, um es zuzugeben, aber nur für den Fall, dass jemand den gleichen dummen Fehler gemacht hat:
Ich habe Code von einem Projekt in ein anderes kopiert und versehentlich denselben Quellcode in die
.h
Datei und die.m
Datei eingefügt (in beiden Fällen hatte ich den für die.h
Datei bestimmten Code eingefügt ). Ich habe meine.m
Datei repariert und es hat funktioniert.quelle
Kann sein, weil Sie
imageNamed
stattimageNamedDR
in die Schnittstelle schreiben ..quelle