2010-03-07 13 views
10

nel progetto corrente Ho un numero di cartelle, con sottocartelle, e queste contengono immagini: 01.png, 02.png.iPhone SDK: sottocartelle all'interno del pacchetto principale

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

Quando compilo l'applicazione, ho guardato dentro il il .app e ho notato che tutte le immagini sono collocati nel livello più alto, con nessuna sottocartella.

Quindi, chiaramente quando si cerca di caricare l'immagine questo non funziona:

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

Ma ancora più strano, quando si carica immagine "f1", l'immagine in realtà carica "F1"

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

Qualcuno ha idee su come ovviare a questo problema?

Esiste un'opzione di compilazione per creare le cartelle nel pacchetto di app?

TIA.

+0

Qual è il problema? Sembra che le tue immagini si stiano caricando bene. – kubi

+0

Il problema è che l'immagine f1.png non è F1.png. – user279778

+0

Visualizza l'immagine sbagliata. – user279778

risposta

25

Per creare le sottocartelle all'interno del pacchetto .app, è necessario selezionare l'opzione "Crea riferimenti alle cartelle per eventuali cartelle aggiunte" anziché il predefinito "Creare gruppi in modo ricorsivo per eventuali cartelle aggiunte" Ora in XCode, viene visualizzata la cartella importata blu piuttosto che giallo. Costruisci e vai e dovresti vedere le cartelle nel tuo file .app.

+0

Perfetto! L'errore che ho fatto è stato di trascinare e rilasciare la struttura delle cartelle nella cartella delle risorse invece di fare clic su un'opzione, selezionare "Aggiungi-> File esistenti" e quindi selezionare il pulsante di opzione "Crea riferimenti alle cartelle per eventuali cartelle aggiunte". Quindi la cartella è blu. – user279778

+0

Come posso fare riferimento ai file nelle sottocartelle create come descritto sopra? 'pathForResource: ofType: inDirectory:' non funziona per me. – pkyeck

+2

ok, ho capito da solo - forse qualcuno è interessato a questo: 'NSString * folderPath = [NSString stringWithFormat: @"% @/myfolder ", [[NSBundle mainBundle] bundlePath]];' – pkyeck

0

Prima di tutto le cartelle create in Xcode sono semplicemente strutture organizzative senza alcuna controparte a livello di filesystem. In altre parole tutte le cartelle tranne la cartella "Classes" si appiattiscono a livello di filesystem. Pertanto, anche se si inserisce il file immagine nella seguente posizione all'interno di xcode, esso esisterebbe ancora al livello principale nel filesystem: f1/f2/f3/f4/f5/image.png. Pertanto, nel metodo pathForResource, non è necessario includere l'argomento inDirectory.

Per quanto riguarda il secondo problema, mac osx non riconosce i nomi di maiuscole e minuscole. Pertanto, f1 e F1 sono equivalenti a mac osx e faranno riferimento allo stesso file. Si può facilmente vedere questo eseguendo i 2 comandi seguenti in una sessione di terminale:

touch f 
touch F 

si noterà che solo 1 file esiste dopo questo: vale a dire f. Se si invertono i 2 comandi, si ottiene comunque un file, ma è denominato F.

+0

Le immagini si trovano nelle cartelle effettive nel sistema e non solo in XCode. Ma Xcode non copia sulle cartelle, solo i file png. – user279778

+0

Ciò che sembra accadere è che le immagini di nome "f1.png" vengono danneggiate dall'immagine "F1.png". – user279778

+0

sì, questo è vero per quanto riguarda l'insensibilità del case. – user279778

0

ennuikiller ha ragione. Penso che puoi organizzare le tue immagini tramite Finder nella sottocartella e quindi aggiornare la posizione dell'immagine in XCode facendo clic con il pulsante destro del mouse sull'immagine e selezionando l'opzione "Ottieni informazioni". Quindi imposta la nuova directory.

Cheers.

+0

Certo, ma non crea ancora cartelle all'interno di .app quando è stato creato. – user279778

0

Volevo solo aggiungere alla risposta di Mugunth, al follow-up su parte della domanda originale, che stava cercando di usare:

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

... per accedere ai file aggiunti utilizzando i riferimenti delle cartelle.La suddetta chiamata 'pathForResouce' funzionerà su simulatori ma non su iPhone reali (verrà restituito nulla), perché non sembrano riconoscere le sottocartelle nella parte 'inDirectory' del metodo. Li riconoscono nella parte 'pathForResource', però. Quindi il modo di riformulare quanto sopra in modo che funzioni su iPhone è:

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

ho seguito la tua risposta, ma le cuciture tutti i file sono memorizzati piatta sulla radice. Se uso il codice sottostante per ottenere il percorso completo

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

ottengo come risultato:/Users/Iosif/Library/Application Support/iPhone Simulator/6.1/Applicazioni/33FB4F79-999C-4455-A092-906A75226CDB /Arithmetics.app/About.png