2010-03-07 5 views
10

im aktuellen Projekt Ich habe eine Reihe von Ordnern mit Unterordnern, und diese enthalten Bilder: 01.png, 02.png.iPhone SDK: Unterordner im Hauptpaket

Folder1/FolderA/f1.png Folder1/FolderB/F1.png

Wenn ich die app zu kompilieren, ich sah in der der .app und bemerkte, dass alle Bilder in der obersten Ebene platziert sind, mit keine Unterordner

So deutlich beim Versuch, das Bild zu laden dies nicht funktioniert:

NSString * filePath = [[NSBundle main] pathForResource: @ "f1" ofType: @ "png" inDirectory: @ "Folder1/FolderA "];

Aber noch seltsam, wenn Bild "f1" geladen, das Bild "F1" tatsächlich

UIImageView * Imageview = [[UIImageView alloc] initWithImage: [UIImage imagenamed: @ "f1.png"]] lädt ;

Jeder hat Ideen, wie Sie dieses Problem umgehen können?

Gibt es eine Kompilieroption zum Erstellen der Ordner im App-Bundle?

TIA.

+0

Was ist das Problem? Es klingt, als würden Ihre Bilder gut geladen. – kubi

+0

Das Problem ist, dass Bild F1.png nicht F1.png ist. – user279778

+0

Es zeigt das falsche Bild an. – user279778

Antwort

25

Um die Unterordner innerhalb des .app-Bundles zu erstellen, sollten Sie die Option "Ordnerreferenzen für hinzugefügte Ordner erstellen" anstelle der Standardeinstellung "Gruppen rekursiv für hinzugefügte Ordner erstellen" aktivieren. Jetzt wird der importierte Ordner in XCode angezeigt blau statt gelb. Build and go und Sie sollten Ordner in Ihrer APP-Datei sehen.

+0

Perfekt! Der Fehler, den ich gemacht habe, war, die Ordnerstruktur in den Resources-Ordner zu ziehen und abzulegen, anstatt Option-Klick zu machen, "Add-> Existing files" auszuwählen und dann den Radiobutton "Create folder references for added folders" auszuwählen. Dann ist der Ordner blau. – user279778

+0

Wie kann ich auf die Dateien in Unterordnern verweisen, die wie oben beschrieben erstellt wurden? 'pathForResource: ofType: inDirectory:' funktioniert nicht für mich. – pkyeck

+2

ok, habe es selbst herausgefunden - vielleicht interessiert sich jemand dafür: 'NSString * folderPath = [NSString stringWithFormat: @"% @/meinOrdner ", [[NSBundle mainBundle] bundlePath]]' – pkyeck

0

Zunächst einmal sind die Ordner, die Sie in Xcode erstellen, einfach Organisationsstrukturen ohne Gegenstück auf der Dateisystemebene. Mit anderen Worten, alle Ordner mit Ausnahme des Ordners "Classes" werden auf Dateisystemebene abgeflacht. Selbst wenn Sie Ihre Bilddatei innerhalb von xcode an die folgende Position setzen, ist sie daher weiterhin auf der obersten Ebene im Dateisystem vorhanden: f1/f2/f3/f4/f5/image.png. Daher sollten Sie in der Methode pathForResource das Argument inDirectory nicht einschließen.

Wie beim zweiten Problem erkennt Mac OSX nicht Groß-und Kleinschreibung Dateinamen. Daher sind f1 und F1 äquivalent zu mac osx und verweisen auf dieselbe Datei. Sie können dies leicht erkennen, indem Sie die folgenden zwei Befehle an einer Terminal-Sitzung ausführt:

touch f 
touch F 

Sie werden bemerken, dass nur 1 Datei danach besteht: nämlich f. Wenn Sie die 2 Befehle umkehren, erhalten Sie immer noch eine Datei, aber sie heißt F.

+0

Die Bilder befinden sich in tatsächlichen Ordnern im System und nicht nur in XCode. Aber Xcode kopiert nicht die Ordner, sondern nur die PNG-Dateien. – user279778

+0

Es scheint, dass Bilder mit dem Namen "f1.png" durch das Bild "F1.png" verunstaltet werden. – user279778

+0

Yep, das stimmt über die Fallunempfindlichkeit in Ordnung. – user279778

0

ennuikiller hat Recht. Ich denke, Sie können Ihre Bilder über den Finder im Unterordner organisieren und dann den Bildort in XCode aktualisieren, indem Sie mit der rechten Maustaste auf Ihr Bild klicken und die Option "Informationen" auswählen. Stellen Sie dann das neue Verzeichnis ein.

Prost.

+0

Sicher, aber das erstellt immer noch keine Ordner innerhalb der .app, wenn es gebaut wird. – user279778

0

Ich wollte nur Mugunth Antwort hinzuzufügen, auf einen Teil der ursprünglichen Frage folgen zu lassen, die zu benutzen versuchen:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"f1" ofType:@"png" inDirectory:@"Folder1/FolderA"]; 

... Dateien zuzugreifen hinzugefügt Ordnerverweise verwenden.Der oben genannte 'pathForResouce'-Aufruf funktioniert auf Simulatoren, aber nicht auf tatsächlichen iPhones (es wird keine zurückgegeben), weil sie Unterordner im' InDirectory 'Teil der Methode nicht zu erkennen scheinen. Sie erkennen sie jedoch im Teil 'pathForResource'. So ist die Art und Weise die oben Umformulierung, so dass es auf dem iPhone funktioniert, ist:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"FolderA/f1" ofType:@"png" inDirectory:@"Folder1"]; 
0

ich Ihre Antwort gefolgt habe, aber es Nähte alle Dateien auf der Root flach gelagert werden. Wenn ich den Code unten benutzen Sie den vollständigen Pfad

CFBundleRef mainBundle = CFBundleGetMainBundle(); 
CFURLRef url = CFBundleCopyResourceURL(mainBundle, CFSTR("About"), CFSTR("png"), NULL); 
UInt8 filePath[PATH_MAX]; 
CFURLGetFileSystemRepresentation(url, true, filePath, sizeof(filePath)); 

ich als Ergebnis erhalten:/Users/iosif/Library/Application Support/iPhone Simulator/6.1/Anwendungen/33FB4F79-999C-4455-A092-906A75226CDB /Arithmetics.app/About.png