Ziel-C-Kategorie Verursacht einen nicht erkannten Selektor

69

Mein Projekt hat eine UIImageKategoriefunktion, 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 UIImageKategoriefunktion 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
Devinross
quelle
1
Bitte geben Sie Code und Ausnahmedetails an. Ohne das ist es unmöglich zu antworten.
Matthias Bauch
Die Erklärung von imageNamedTT:wäre auch nützlich.
James Huddleston
1
Könnte es sein, dass Ihre Instanz tatsächlich eine andere Klasse ist?
Georg Schölly
ps. Das ist ein seltsames Problem, ich habe es schon lange einwandfrei funktionieren lassen und etwas ist einfach durcheinander geraten.
Devinross
Wahrscheinlich bin nur ich dumm, aber Sie haben 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?
Popeye

Antworten:

219

Ein paar Möglichkeiten:

  1. Sie haben keine Verknüpfung UIImage+TTShare.mzu Ihrem Ziel hergestellt. Während Sie also den Header haben, kompilieren Sie die Implementierung nicht.
  2. Wenn dies Teil einer statischen Bibliothek ist, müssen Sie die Build-Einstellung " Andere Linker-Flags" für die App hinzufügen -all_load, die mit der Bibliothek verknüpft ist.
Dave DeLong
quelle
Ich glaube, ich habe mein statisches Bibliotheksziel durcheinander gebracht.
Devinross
26
Vielen Dank, dass Sie auf das Problem mit statischen Bibliotheken hingewiesen haben. Entwickler.apple.com/library/mac/#qa/qa1490/_index.html enthält weitere Informationen. Um klar zu sein, müssen Sie dieses Flag zu den Linker-Flags für die App hinzufügen, die die statische Bibliothek enthält, nicht beim Erstellen der statischen Bibliothek selbst.
Bob Whiteman
1
Wie unter stackoverflow.com/a/8437129/1972476 angegeben, kann Xcode auch hier der Schuldige sein. Ich hatte versehentlich die Dateien mit der Klassenvorlage erstellt, diese gelöscht und Dateien mit demselben Namen mithilfe der Kategorievorlage neu erstellt. Nach dem Umbenennen der Implementierung (und zurück) funktionierte es.
Seán Labastille
Sie meinen , -all_loadin den Build - Einstellungen von der Client - Anwendung , nicht , wenn die statische Bibliothek richtigen Gebäude? Das hat bei mir funktioniert.
Nicolas Miari
7
Stellen Sie vor der Verwendung -all_loadsicher, dass nur das Hinzufügen -ObjCdas Problem behebt. Alle Ladevorgänge erhöhen die Größe der ausführbaren Datei unnötig.
LearnCocos2D
10

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

ling
quelle
Beeindruckend. Na sicher. In meiner Situation hatte ich eine Kategorie in einem Unterprojekt meiner Haupt-App, die nur im Unterprojekt verwendet wurde, aber durch Hinzufügen von -ObjC zur Haupt-App wurde dies behoben. Dankeschön.
Orion Elenzil
6

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.

Clive Paterson
quelle
0

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

H6.
quelle
0

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.

Voda Ion
quelle
0

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 .hDatei und die .mDatei eingefügt (in beiden Fällen hatte ich den für die .hDatei bestimmten Code eingefügt ). Ich habe meine .mDatei repariert und es hat funktioniert.

Nikolay Suvandzhiev
quelle
0

Kann sein, weil Sie imageNamedstatt imageNamedDRin die Schnittstelle schreiben ..

Hlung
quelle