2015-04-15 17 views
5

Mam images.xcassets liście zasobów kopii kopia pakietu, a ja starałem się po prostu podać nazwę pliku samodzielnie: MSB_big_icon, przed próbą dodania ścieżki w images.xcassets.NSbundle pathforresource nie znajdowanie pliku

Czy ktoś może mi powiedzieć, co robię źle?

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]; 

Odpowiedz

2

David Ansermot ma rację, że xcassets jest o wiele lepsze podejście i zdecydowanie preferowane. Jeśli nie możesz tego użyć (działa na przykład na starszych wersjach iOS), nadal umieszczaj wszystko w jednym katalogu i używaj imageNamed:. Ma to znaczące korzyści z buforowania w porównaniu z ręcznym ładowaniem pliku.

An asset catalog (xcassets) to (stosunkowo) nowy, ujednolicony sposób zarządzania zasobami obrazu. Obrazy nie są już dostępne jako oddzielne pliki na dysku. Zamiast tego imageNamed: sprawdza katalog zasobów i pobiera właściwy zasób.

Przed katalogiem zasobów (i nadal dla nie-obrazów) aktywa były przechowywane w zlokalizowanych katalogach. Wszystkie nielokalizowane zasoby zostaną umieszczone w katalogu o nazwie Resources (bez względu na to, gdzie te pliki mogą znajdować się w drzewie źródłowym i bez względu na to, w jaki sposób pliki te mogą znajdować się w folderach Xcode). Zlokalizowane pliki będą przechowywane w katalogach takich jak English.lproj lub French.lproj. Po wywołaniu NSBundle wywołań MyImage, analizuje każdy zlokalizowany katalog w porządku skonfigurowanym przez użytkownika, a jeśli nie może go znaleźć w żadnym z tych katalogów, wygląda na Resources.

Teraz możliwe jest przechowywanie pełnych katalogów jako "zasobów" poprzez oznaczenie ich jako odniesień do katalogu w Xcode. W takim przypadku cały katalog zostanie skopiowany do Resources lub odpowiedniego zlokalizowanego katalogu. W celu znalezienia plików w takim katalogu można użyć metod ...inDirectory: dla wersji . Tak więc przez większość czasu chcesz po prostu użyć imageNamed:, który ma pobrać elementy z katalogu zasobów, jeśli są dostępne, a następnie wyszukać zlokalizowane katalogi, a następnie spójrz na Resources.Jeśli chcesz znaleźć się bez obrazu, lub jeśli z jakiegoś powodu chcesz prawdziwą ścieżkę do pliku, można obliczyć to tak:

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

A jeśli to źródło było w drzewie katalogów (bo było odniesienie katalog w Xcode), można uzyskać dostęp to tak:

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

może po prostu trzeba uciec się do standardu, z nagą w tył głowy, że nie dostałem tego do pracy. Czy źle rozumiem, że jeśli coś znajduje się na liście zasobów pakietu kopii, oznacza to, że wymieniony folder jest dodawany do pakietu, a następnie może być używany przez NSBundle? Ponieważ użycie ostatniego fragmentu kodu nie działa pomimo, że images.xcassets jest w pakiecie kopii. lista. – DevilInDisguise

+0

Jeśli umieścisz plik w zasobach pakietu kopii, znajdzie się on w folderze głównym. Wszystkie podkatalogi nad nim zostaną usunięte. Jeśli chcesz zachować katalogi, musisz skopiować sam katalog (a jak pamiętam, minęło trochę czasu), musisz uczynić katalog "odniesieniem do katalogu" zamiast "folderem". –

+0

Ale dlaczego Xcode miałby kłopotać się już dodanymi plikami i images.xcassets, aby skopiować zasoby pakietu, ponieważ jest już w folderze głównym, a z drugiej strony istnieją różne foldery/pliki w folderze głównym, które nie są w pakiecie kopii. Z Twojego komentarza wynika, że ​​zasób zasobu kopii jest większy, gdy potrzebujesz dodać folder z folderu głównego aplikacji do aplikacji, prawda? Tak czy siak, jestem nadal trochę zaskoczony, dlaczego to podejście wciąż nie działa. – DevilInDisguise

0

Oto exemple kod z jednego z moich aplikacji:

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

W "Applications__GENERIC.plist" przechowywany jest tak:
enter image description here


innych rozwiązań: Użyj images.xcassets. Następnie w kodzie, aby załadować obraz, należy użyć kodu:

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

Nie należy umieszczać żadnych ścieżkę lub rozszerzenia, tylko nazwę obrazka

+0

Jestem zainteresowany obrazem + WithContentsOfFile, ponieważ była to metoda zastosowana w przykładowej aplikacji, dlatego zastanawiam się, jak to działa (lub nie). Stworzyłem już niektóre obrazy, które opublikowałeś, ale znowu jestem zainteresowany tym, dlaczego nie mogę uzyskać powyższego działającego – DevilInDisguise

+0

rozszerzenie można dodać, więc nie ma sensu sugerować, że nazwa obrazu _must be_ bez rozszerzenia. – holex

+0

Zaktualizowano moją odpowiedź. @holex, jeśli używasz xcassets, nie musisz tego robić. tylko nazwa zasobu obrazu;) –

0

Spróbuj użyć tego:

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

Co można też zrobić do debugowania jest wydrukowanie

[[NSBundle mainBundle] bundleURL] 

Następnie przejdź do tego folderu i sprawdź, czy struktura folderów odpowiada używanej ścieżce.

Właśnie zmagałem się z tym dzisiaj, mam nadzieję, że to działa dla ciebie też.

+0

, ale ponieważ images.xcassets znajduje się na liście zasobów pakietu kopii, myślę, że dobrze byłoby zacząć od tej lokalizacji. Tymczasem Zastanawiam się, dlaczego bundlePath zwraca tę samą ścieżkę co bundleURL, ale z innym kluczem – DevilInDisguise

Powiązane problemy