2011-08-24 6 views
6

Supponiamo di disporre di un framework iOS o Mac esistente che chiameremo Test.framework. Questo framework è stato compilato e collegato con successo (un trucco è stato fatto per lipo sia per i386 che per armv6/7 arch per la parte iOS) e funziona perfettamente.Aggiungere un'immagine (o altre risorse) a un Mac o iOS Framework

Ora voglio aggiungere un'immagine chiamiamolo 'test.png'. Ho copiato nella cartella Risorse del mio quadro in modo da avere la seguente struttura:

ls Test.framework 

- Headers -> Versions/Current/Headers 
- Resources -> Versions/Current/Resources 
- Test -> Versions/Current/Test 
- Versions 

ls Test.framework/Resources 

- Info.plist 
- test.png 

Eppure, quando creo un progetto utilizzando il mio quadro non posso accedere a tale immagine.

ho provato:

[UIImage imageNamed:@"test.png"] 
[UIImage imageNamed:@"Test.framework/test.png"] 
[UIImage imageNamed:@"Test.framework/Resources/test.png"] 

Ma niente ha funzionato che mi dava sempre indietro un oggetto nil.

Qualche idea?

EDIT

Dopo molte ulteriori indagini sembra quello che sto cercando di realizzare non può essere fatto su iOS. Il motivo è che il bundle di applicazione finale (la .app) non copia i framework privati ​​in cui verranno compilate le applicazioni per Mac OS.

Questo è ulteriormente dettagliato nello iOS Bundle Structures documentation.

Grazie a Rob Keniger e xuzhe per il loro apprezzato aiuto. Attribuirò xuzhe per la risposta in quanto è la risposta più appropriata al mio problema originale (anche se il commento di Rob mi ha fatto scavare più in profondità nel problema)

risposta

4

Il metodo "imageNamed:" è solo per immagini nella tua App fascio. Dovresti utilizzare

[[UIImage alloc] initWithContentsOfFile:path]; 

invece.

Informazioni sul percorso, poiché non sono sicuro che il "Test.Framework" sia nel pacchetto di app, non sono in grado di fornirvi un codice di esempio. Ma se la dose, il codice qui sotto dovrebbe funzionare:

NSString* path = [Nsstring stringWithFormat:@"%@/Test.framework/Resources/test.png", [[NSBundle mainBundle] bundlePath]]; 
+0

dicendo che "The" imageNamed: "il metodo è solo per le immagini nel pacchetto App" non è completamente vero. Se aggiungo un pacchetto (ad esempio test.bundle) al mio progetto e questo pacchetto contiene test.png, allora [UIImage imageNamed: @ "test/test.png"] funzionerà correttamente. – apouche

+0

tuttavia la tua soluzione è interessante, ma non ho il framework in bundle nella mia applicazione (può essere installato nelle cartelle framework della commissione) – apouche

+0

@apouche Se stai aggiungendo un bundle nel pacchetto App e quindi chiama '[UIImage imageNamed: @ "test.bundle/test.png"]; 'è OK perché il test.bundle è anche nel bundle principale. Se non lo è, dubito che "imageNamed:" possa trovarlo. – xuzhe

3

si può ottenere il pacchetto per una particolare classe utilizzando [NSBundle bundleForClass:[SomeClass class]]. Tutto quello che devi fare è passare una classe che è definita nel framework e avrai un riferimento al pacchetto del framework.

si può quindi chiedere il bundle per il percorso per l'immagine utilizzando il metodo di pathForResource:ofType:NSBundle, e quindi utilizzare il metodo di initWithContentsOfFile:NSImage per creare la vostra immagine.

Si noti che non è mai necessario codificare i percorsi. Mai. Esistono molte funzioni e metodi diversi per ottenere percorsi alle risorse, non è mai necessario codificarli.

+1

questo è abbastanza intelligente, ma sfortunatamente non ha dato i risultati attesi. quando ho fatto '[NSBundle bundleForClass: [SomeClass class]]' mi ha restituito lo stesso identico oggetto del bundle principale. Il motivo è che tutte le classi usate dal mio Test.framework sono state aggiunte al binario del progetto finale e non "copiate" nel percorso finale di app. Quindi alla fine le risorse vengono saltate :( – apouche

+0

grazie per il tuo aiuto, ciò che volevo realizzare non può essere fatto su iOS, fai riferimento alla mia modifica se vuoi maggiori informazioni – apouche

Problemi correlati