2010-03-07 9 views
10

w bieżącym projekcie Mam wiele folderów z podfolderami, a te zawierają obrazy: 01.png, 02.png.iPhone SDK: podfolder wewnątrz głównego pakietu

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

Kiedy skompilować aplikację, spojrzałem na .app wewnątrz i zauważyłem, że wszystkie zdjęcia są umieszczane na najwyższym poziomie, z bez podfolderów.

więc wyraźnie, gdy próbuje załadować obraz ten nie działa:

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

Ale jeszcze bardziej dziwnie, podczas ładowania obrazu "F1", obraz rzeczywiście ładuje "F1"

UIImageView * ImageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @ "f1.png"]] ;

Ktoś ma pomysły, jak obejść ten problem?

Czy istnieje opcja kompilacji do utworzenia folderów w pakiecie aplikacji?

TIA.

+0

Na czym polega problem? Wygląda na to, że twoje obrazy ładują się dobrze. – kubi

+0

Problem polega na tym, że obraz f1.png to nie F1.png. – user279778

+0

Wyświetla zły obraz. – user279778

Odpowiedz

25

Aby utworzyć podfoldery wewnątrz pakietu .app, należy zaznaczyć opcję "Utwórz odniesienia do folderów dla wszystkich dodanych folderów" zamiast domyślnie "Rekurencyjnie tworzyć grupy dla dowolnych dodanych folderów" Teraz w XCode pojawi się Twój zaimportowany folder niebieski zamiast żółtego. Buduj i idź, powinieneś zobaczyć foldery w swoim pliku .app.

+0

Idealny! Błąd, który popełniłem, polegał na przeciągnięciu i upuszczeniu struktury folderów do folderu zasobów zamiast klikania z opcją, wybierając "Dodaj-> Istniejące pliki", a następnie wybierając przycisk opcji "Utwórz odniesienia do folderu dla wszystkich dodanych folderów". Następnie folder jest niebieski. – user279778

+0

Jak mogę odwoływać się do plików w podfolderach utworzonych w sposób opisany powyżej? 'pathForResource: ofType: inDirectory:' nie działa dla mnie. – pkyeck

+2

ok, sam to wymyśliłem - może ktoś jest tym zainteresowany: 'NSString * folderPath = [NSString stringWithFormat: @"% @/myfolder ", [[NSBundle mainBundle] bundlePath]];' – pkyeck

0

Przede wszystkim foldery tworzone w Xcode są po prostu strukturami organizacyjnymi bez żadnego odpowiednika na poziomie systemu plików. Innymi słowy, wszystkie foldery z wyjątkiem folderu "Klasy" zostają spłaszczone na poziomie systemu plików. Dlatego nawet jeśli umieścisz plik obrazu w następującej lokalizacji w kodzie xcode, nadal będzie on znajdować się na najwyższym poziomie w systemie plików: f1/f2/f3/f4/f5/image.png. Dlatego w metodzie pathForResource nie należy uwzględniać argumentu InDirectory.

Jeśli chodzi o drugi problem, mac osx nie rozpoznaje nazw plików z rozróżnianiem wielkich i małych liter. Dlatego f1 i F1 są równoważne mac osx i odniesie się do tego samego pliku. Można łatwo zobaczyć, wykonując następujące polecenia 2 w sesji terminala:

touch f 
touch F 

można zauważyć, że istnieje tylko jeden plik po to mianowicie: f. Jeśli odwrócisz 2 polecenia, nadal otrzymasz jeden plik, ale ma on nazwę F.

+0

Obrazy są w rzeczywistych folderach w systemie, a nie tylko w XCode. Ale Xcode nie kopiuje folderów, tylko pliki png. – user279778

+0

Wygląda na to, że obrazy o nazwie "f1.png" zostają zaciśnięte przez obraz "F1.png". – user279778

+0

Tak, to prawda o niewrażliwości na wielkość liter. – user279778

0

ennuikiller ma rację. Myślę, że możesz uporządkować swoje obrazy za pomocą Findera w podfolderze, a następnie odświeżyć lokalizację obrazu w XCode, klikając prawym przyciskiem myszy obraz i wybierając opcję "Pobierz informacje". Następnie ustaw nowy katalog.

Pozdrawiam.

+0

Oczywiście, ale to nadal nie tworzy folderów wewnątrz pliku .app po jego zbudowaniu. – user279778

0

Chciałem tylko dodać do odpowiedzi Mugunth jest, aby śledzić na części oryginalne pytanie, który próbuje użyć:

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

... dostęp do plików dodane za pomocą odniesień folderu.Powyższe wywołanie "pathForResouce" będzie działać na symulatorach, ale nie na rzeczywistych iPhone'ach (zostanie zwrócone zero), ponieważ nie rozpoznają podfolderów w części metody "inDirectory". Jednak rozpoznają je w części "pathForResource". Więc droga przeformułowanie wyżej tak, że działa na iPhone jest:

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

Mam następnie swoją odpowiedź ale szwy wszystkie pliki są przechowywane płasko na root. Jeśli mogę użyć kodu poniżej, aby uzyskać pełną ścieżkę

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

otrzymuję w wyniku:/Users/iosif/Library/Application Support/iPhone Simulator/6.1/Applications/33FB4F79-999C-4455-A092-906A75226CDB /Arithmetics.app/About.png