2015-04-15 16 views
5

I file images.xcassets sono inclusi nelle risorse del pacchetto di copie e ho cercato di indicare il nome del file da solo: MSB_big_icon, prima di provare ad aggiungere il percorso all'interno di images.xcassets.NSbundle pathforresource non trova il file

Qualcuno può dirmi cosa sto facendo male?

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

risposta

2

David Ansermot è giusto che xcassets è un approccio molto meglio e fortemente preferito. Se non è possibile utilizzarlo (eseguendo su versioni precedenti di iOS, ad esempio), inserire ancora tutto in una directory e utilizzare imageNamed:. Ciò ha notevoli vantaggi di memorizzazione nella cache rispetto al caricamento manuale del file.

Un asset catalog (xcassets) è un (relativamente) nuovo modo unificato di gestione delle risorse di immagine. Le immagini non sono più accessibili come file separati sul disco. Invece, imageNamed: consulta il catalogo delle risorse e recupera la risorsa corretta.

Prima di cataloghi di risorse (e ancora, per non immagini), le risorse erano memorizzate in directory localizzate. Tutte le risorse non localizzate verranno inserite in una directory denominata Resources (indipendentemente da dove tali file possano apparire nella struttura dei sorgenti e non importa in che modo tali file possano essere disposti nelle cartelle Xcode). I file localizzati verrebbero archiviati in directory come English.lproj o French.lproj. Quando si effettuano chiamate NSBundle per caricare MyImage, esso esamina ogni directory localizzata nell'ordine che l'utente ha configurato e, se non riesce a trovarlo in nessuna di queste directory, appare in Resources.

Ora è possibile memorizzare directory complete come "una risorsa" contrassegnandole come riferimenti di directory in Xcode. In tal caso, l'intera directory verrà copiata in Resources o nella directory localizzata appropriata. Per trovare i file all'interno di tale directory è possibile utilizzare la versione ...inDirectory: dei metodi NSBundle. Quindi, per la maggior parte del tempo, si desidera utilizzare semplicemente lo imageNamed:, che recupera elementi dal catalogo delle risorse, se disponibile, quindi cerca nelle directory localizzate, quindi cerca in Resources.Se hai bisogno di trovare un non-immagine, o se per qualche motivo si desidera che il percorso vero e proprio del file, è possibile calcolare in questo modo:

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

E se quella risorsa fosse in un albero (perché era un riferimento directory in Xcode), è possibile accedere in questo modo:

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

forse ammalato, non devo fare altro che ricorrere allo standard, con un ronzio nella parte posteriore della testa che non ho potuto farlo funzionare. Ho torto a capire che se qualcosa è elencato nelle risorse del pacchetto di copia, significa che la cartella elencata viene aggiunta al pacchetto e può quindi essere utilizzata tramite NSBundle? Perché l'utilizzo dell'ultimo snippet di codice non funziona malgrado images.xcassets si trovi sul res del pacchetto di copia. elenco. – DevilInDisguise

+0

Se si inserisce un file nelle risorse del pacchetto di copia, questo si troverà nella cartella principale. Tutte le sottodirectory sopra di esso verranno rimosse. Se vuoi mantenere le directory, devi copiare la directory stessa (e come ricordo, è passato un po 'di tempo), devi fare in modo che la directory sia un "riferimento alla directory" piuttosto che una "cartella". –

+0

Ma perché Xcode dovrebbe preoccuparsi di avere già aggiunto file e images.xcassets per copiare le risorse del bundle poiché si trova già nella cartella principale, e d'altra parte ci sono varie cartelle/file nella cartella radice che non sono nel pacchetto di copia. Dal tuo commento sembra che la copia del pacchetto di risorse sia più utile quando devi aggiungere alcune cartelle dall'esterno della cartella principale dell'app all'app, giusto? In ogni caso, sono ancora un po 'sconcertato sul perché questo approccio non funzioni ancora. – DevilInDisguise

0

Ecco un exemple codice da una delle mie applicazioni:

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

Il "Applications__GENERIC.plist" viene memorizzato in questo modo:
enter image description here


Altre soluzioni: Usa le immagini.xcassette. Poi nel codice per caricare un'immagine, utilizzare il codice:

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

Non mettere qualsiasi percorso o estensione, solo il nome dell'immagine

+0

Mi interessa il + imageWithContentsOfFile, in quanto era il metodo utilizzato in un'app di esempio, quindi mi chiedo come funziona (o meno). Ho già creato alcune immagini come quelle che hai pubblicato, ma, ancora una volta, mi interessa sapere perché non riesco a ottenere l'estensione – DevilInDisguise

+0

che può essere aggiunta, quindi non c'è motivo di suggerire che il nome dell'immagine debba essere _ senza estensione. – holex

+0

Aggiornato la mia risposta. @holex, se usi xcassets non devi. solo il nome della risorsa immagine;) –

0

provare a utilizzare questo:

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

che cosa si può fare anche per eseguire il debug è quello di stampare

[[NSBundle mainBundle] bundleURL] 

Quindi passare a quella cartella e vedere se la struttura della cartella corrisponde al percorso che si utilizza.

Ho appena fatto fatica con questo oggi, spero che funzioni anche per te.

+0

ma poiché images.xcassets è elencato nelle risorse del bundle di copia, penso che sarei in grado di iniziare da quella posizione. Nel frattempo mi chiedo perché bundlePath restituisca lo stesso percorso di bundleURL, ma con una chiave diversa – DevilInDisguise

Problemi correlati