2015-02-26 12 views
8
NSBundle.mainBundle().URLForResource("bach1", withExtension: "jpg") 

Powyższy kod zwraca wartość null.NSBundle.mainBundle() URLForResource ("bach1" withExtension: "jpg"). Powrocie zerowy

W celu sprawdzenia, czy plik istnieje, czy nie, użyłem poniżej kodu:

let fileManager = NSFileManager.defaultManager() 

if fileManager.fileExistsAtPath(savepath) { 
    println("exist") 
} 

Powyższy kod zwraca że plik istnieje w katalogu.

Więc nie rozumiem, dlaczego pierwszy kod wraca zerowej

Odpowiedz

12

Twój problem polega na tym, że NSBundle.mainBundle(). URLForResource ("bach1", withExtension: "jpg") zwraca opcjonalny NSURL. Trzeba użyć, jeśli pozwalają na to rozpakować i wyodrębnić ścieżkę od zwracanej url następująco:

if let resourceUrl = NSBundle.mainBundle().URLForResource("bach1", withExtension: "jpg") { 
    if NSFileManager.defaultManager().fileExistsAtPath(resourceUrl.path!) { 
     print("file found") 
    } 
} 
+0

z w tym fragmencie, nigdy nie drukuję "znalezionego pliku", resourceUrl jest zawsze zerowe. Mam plik w pakiecie aplikacji, ale go nie widzę. –

+0

Prawdopodobnie twój plik nie jest powiązany z Twoją aplikacją. Jeśli zapisałeś plik w folderze dokumentów, musisz pobrać ten folder i dołączyć nazwę pliku, który próbujesz załadować do adresu URL folderu. –

2

NSBundle.URLForResource zwraca tylko pliki, które są wiązane w aplikacji przy kompilacji/kompilacji, po przeciągnięciu pliku do projektu Xcode jak i dodać go do celu aplikacji. Zwykle możesz z niego korzystać, gdy Twoja aplikacja ma fabrycznie zainstalowane potrzebne zasoby, takie jak obrazy, filmy, bazy danych i inne pliki.

Wygląda na to, że savepath to ścieżka, do której napisała Twoja aplikacja podczas pracy (może do katalogu Dokumenty Twojej aplikacji?). Z tego powodu plik znajduje się poza pakietem i będziesz musiał go gdzieś przechowywać (lub skompilować ponownie), jeśli będziesz musiał odwołać się do pliku w przyszłości.

8

Swift 3.x

if let resourceUrl = Bundle.main.url(forResource: "bach1", withExtension: "jpg") { 
    if FileManager.default.fileExists(atPath: resourceUrl.path) { 
     print("file found") 
    } 
} 
+0

Ta składnia działa również w Swift 3.1. –

2

Okazało się, że masz aby przejść do fazy budowania -> Kopiuj zasoby pakietu i ręcznie dodaj swój przedmiot do pakietu. W moim przypadku był to plik wideo, który nie został poprawnie dodany do pakietu.

1

Miałem również ten problem. Moja poprawka była:

  • Wybieranie pliku w nawigatorze projektu
  • Otwórz „Inspector File” (na panelu bocznym po prawej stronie)
  • Sprawdzanie cel aplikacji w docelowej Membership