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

Il codice sopra riportato restituisce null.NSBundle.mainBundle(). URLForResource ("bach1", withExtension: "jpg") restituisce null

al fine di verificare se il file esiste o no, ho usato il codice qui sotto:

let fileManager = NSFileManager.defaultManager() 

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

Il codice precedente restituisce il file esiste nella directory.

Quindi non capisco il motivo per cui il primo codice sta tornando nulla

risposta

12

Il tuo problema è che NSBundle.mainBundle(). URLForResource ("bach1", withExtension: "jpg") restituisce un NSURL opzionale. È necessario utilizzare se lasciarlo per scartarlo ed estrarre il vostro percorso del file dalla URL restituito come segue:

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

con questo frammento, non stampo mai "file trovato", resourceUrl è sempre nullo. Ho il file nel mio pacchetto di app, ma non lo vedo –

+0

Probabilmente il tuo file non è in bundle con la tua app. Se hai salvato il tuo file nella cartella documenti devi ottenere l'URL della cartella e aggiungere il nome del file che stai cercando di caricare nella cartella url –

2

NSBundle.URLForResource restituisce solo i file che sono in bundle nella vostra applicazione in build/tempo di compilazione, come quando si trascina un file nel progetto Xcode e aggiungerlo al target della tua app. Solitamente puoi usarlo quando la tua app viene precaricata con le risorse di cui hai bisogno, come immagini, filmati, database e altri file.

Sembra che savepath sia un percorso in cui l'applicazione ha scritto durante l'esecuzione (forse nella directory Documenti della tua app?). Per questo motivo, il file si trova all'esterno del bundle e sarà necessario memorizzare quel percorso/URL da qualche parte (o ricostruirlo di nuovo) se è necessario fare riferimento al file in futuro.

8

3.x Swift

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

Questa sintassi funziona anche in Swift 3.1. –

2

ho scoperto che hai per entrare effettivamente in Build Fasi -> Copia le risorse del pacchetto e aggiungi manualmente il tuo articolo a volte al pacchetto. Nel mio caso si trattava di un file video che non veniva aggiunto correttamente al bundle da solo.

1

Ho avuto anche questo problema. La mia soluzione era:

  • Selezione del file nella navigazione di progetto
  • Aprire il 'Inspector File' (nel riquadro a destra)
  • Controllo del bersaglio app nel target appartenenza