2015-04-15 7 views
5

Ich habe images.xcassets aufgelisteten mehrer Kopie Bundle-Ressourcen, und ich habe versucht, nur den Dateinamen selbst anzugeben: MSB_big_icon, bevor Sie versuchen, den Pfad in images.xcassets hinzuzufügen.NSbundle pathforresource nicht finden Datei

Kann mir jemand sagen, was ich falsch mache?

NSString *path = [[NSBundle mainBundle]pathForResource:@"/Raymio_android_images/MSB_big_icon.imageset/MSB_big_icon" ofType:@"png"]; 
NSLog(@"path: %@", path); 
MSBIcon *tilecon = [MSBIcon iconWithUIImage:[UIImage imageWithContentsOfFile:path] error:&error]; 

Antwort

2

David Ansermot richtig, dass xcassets ist ein viel besserer Ansatz und stark bevorzugt. Wenn Sie das nicht verwenden können (z. B. bei älteren iOS-Versionen), legen Sie alles in ein Verzeichnis und verwenden Sie imageNamed:. Dies hat erhebliche Vorteile beim Caching gegenüber dem manuellen Laden der Datei.

Ein asset catalog (xcassets) ist eine (relativ) neue, einheitliche Art der Verwaltung von Bildressourcen. Auf die Bilder kann nicht mehr als separate Datei auf der Festplatte zugegriffen werden. Stattdessen ruft imageNamed: den Asset-Katalog ab und ruft das richtige Asset ab.

Vor Asset-Katalogen (und immer noch für Nicht-Images) wurden Assets in lokalisierten Verzeichnissen gespeichert. Alle nicht lokalisierten Assets werden in ein Verzeichnis mit dem Namen Resources gestellt (unabhängig davon, wo diese Dateien in Ihrem Quellbaum erscheinen und unabhängig davon, wie diese Dateien in Ihren Xcode-Ordnern angeordnet sind). Lokalisierte Dateien würden in Verzeichnissen wie English.lproj oder French.lproj gespeichert werden. Wenn Sie NSBundle Aufrufe zum Laden MyImage aufrufen, wird jedes lokalisierte Verzeichnis in der vom Benutzer konfigurierten Reihenfolge betrachtet. Wenn es in einem dieser Verzeichnisse nicht gefunden werden kann, wird Resources angezeigt.

Jetzt ist es möglich, vollständige Verzeichnisse als "Ressource" zu speichern, indem Sie sie als Verzeichnisreferenzen in Xcode markieren. In diesem Fall wird das gesamte Verzeichnis in Resources oder das entsprechende lokalisierte Verzeichnis kopiert. Um Dateien in einem solchen Verzeichnis zu finden, können Sie die ...inDirectory: Version der NSBundle Methoden verwenden. Also die meiste Zeit, Sie wollen nur imageNamed: verwenden, die Dinge aus dem Asset-Katalog zu holen, wenn verfügbar ist, und suchen Sie lokalisierte Verzeichnisse, und dann in Resources suchen.Wenn Sie ein Nicht-Bild finden müssen, oder wenn Sie aus irgendeinem Grund den realen Pfad zur Datei möchten, können Sie es wie folgt berechnen:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"]; 

Und wenn die Ressource waren in einem Verzeichnisbaum (weil es war in Xcode ein Verzeichnis Referenz), können Sie es wie folgt zugreifen können:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" 
               ofType:@"png" 
              inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"]; 
+0

vielleicht krank muss nur auf den Standard gehen, mit einem Nerv in meinem Hinterkopf, dass ich das nicht zur Arbeit bekommen. Ist es falsch zu verstehen, dass, wenn etwas unter den Ressourcen des Kopierpakets aufgeführt wird, der aufgelistete Ordner zum Bundle hinzugefügt wird und dann über NSBundle verwendet werden kann? Die Verwendung des letzten Code-Snippets funktioniert nicht, obwohl sich images.xcassets im Kopierpaket befinden. Liste. – DevilInDisguise

+0

Wenn Sie eine Datei in Kopienpaket-Ressourcen einfügen, befindet sie sich im Stammordner. Alle darüber liegenden Unterverzeichnisse werden entfernt. Wenn Sie Verzeichnisse behalten wollen, müssen Sie das Verzeichnis selbst kopieren (und wie ich mich erinnere, es ist eine Weile her), müssen Sie das Verzeichnis eine "Verzeichnisreferenz" anstelle eines "Ordners" machen. –

+0

Aber wieso würde Xcode daran scheitern, bereits Dateien und images.xcassets hinzuzufügen, um Bundle-Ressourcen zu kopieren, da es bereits im Stammordner ist, und andererseits gibt es verschiedene Ordner/Dateien im Stammordner, die nicht im Bundle sind. Aus deinem Kommentar klingt es wie Kopierbündel-Ressource ist mehr, wenn du einen Ordner außerhalb deines Apps-Stammordners zur App hinzufügen musst, oder? Wie auch immer, ich bin immer noch ein wenig verwirrt darüber, warum dieser Ansatz immer noch nicht funktioniert. – DevilInDisguise

0

Hier ist ein Code exemple von einem meiner apps:

NSString *appKey = @"Applications__GENERIC"; 
NSString *path = [[NSBundle mainBundle] pathForResource:appKey ofType:@"plist"]; 
appData = [NSDictionary dictionaryWithContentsOfFile:path]; 

Die "Applications__GENERIC.plist" wie folgt gespeichert wird:
enter image description here


Andere Lösungen: Verwenden Sie die Bilder.xcassets. Dann in Ihrem Code ein Bild zu laden, verwenden Sie den Code:

UIImage *image = [UIImage imageNamed:@"MyImageWithoutExtension"]; 

keine Pfad oder Erweiterung Legen Sie nur den Namen des Bildes

+0

Ich bin interessiert an der + ImageWithContentsOfFile, wie das war die Methode in einer Beispiel-App verwendet, daher meine Frage, wie es funktioniert (oder nicht). Ich habe bereits einige der Bilder erstellt wie Sie gepostet, aber wieder, ich bin daran interessiert, warum ich nicht die obige funktionierende – DevilInDisguise

+0

die Erweiterung kann hinzugefügt werden, so dass kein Punkt darauf hindeutet, dass der Name des Bildes _ _ ohne _ Erweiterung sein soll. – holex

+0

Aktualisiert meine Antwort. @holex, wenn du xcases verwendest, musst du nicht. nur der Bild-Asset-Name;) –

0

Versuchen Sie dies mit:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png" inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"]; 

Was können Sie auch zu debuggen tun ist aus

drucken
[[NSBundle mainBundle] bundleURL] 

Navigieren Sie dann zu diesem Ordner und sehen Sie, ob die Ordnerstruktur dem Pfad entspricht, den Sie verwenden.

Ich habe gerade damit gestritten, hoffe, es klappt auch für dich.

+0

aber da images.xcassets unter Kopierbündel-Ressourcen aufgeführt ist, denke ich, dass ich von diesem Ort aus gut gestartet wäre. Inzwischen wundere ich mich, warum BundlePath den gleichen Pfad wie bundleURL, aber mit einem anderen Schlüssel zurückgibt – DevilInDisguise

Verwandte Themen