2014-09-09 16 views
25

Sto provando a caricare un'immagine da un framework iOS 8 che sto scrivendo (in Swift). Sto usando Xcode 6 Beta 6Carica immagine dal framework iOS 8

Questo codice non funziona (cioè immagine di carico) se l'immagine viene memorizzata nel mio quadro Images.xcassets:

let image = UIImage(named: "Background.png") 

Se l'immagine viene memorizzata in un Images.xcassets di un host applicazione (che utilizza il framework), quindi l'immagine viene caricata correttamente (dal codice all'interno del framework).

Vedo che il framework Images.xcassets è incluso nella fase Copy Bundle Resources.

Sto anche utilizzando un file storyboard come risorsa nel framework; e questo si carica correttamente.

Ho provato a rinominare Images.xcassets del framework per evitare un qualche tipo di collisione di nomi con l'applicazione host, ma anche questo non funziona.

risposta

48

Mentre @Renatus risposta è perfettamente valido e affronta la questione centrale (bundle per quadro deve essere specificato), ho voluto postare la soluzione sono andato con dal momento che è un po 'più diretto:

Swift 3,0/4,0

let image = UIImage(named: "YourImage", in: Bundle(for: YOURFRAMEWORKCLASS.self), compatibleWith: nil) 

In alternativa, è possibile utilizzare questo modello per non class, alias non "statica", funzioni:

let image = UIImage(named: "YourImage", in: Bundle(for: type(of: self)), compatibleWith: nil) 

o di questo modello per class funzioni:

let image = UIImage(named: "YourImage", in: Bundle(for: self), compatibleWith: nil) 

Queste alternative sono migliori per il taglio e incollare.

+0

Dovrebbe essere contrassegnato come risposta corretta. – Zorayr

+2

Ha funzionato per me, ma sarebbe opportuno elaborare ciò che si intende per YOURFRAMEWORKCLASS. Inizialmente ho provato l'header dell'ombrello, ma non ha funzionato, quindi l'ho sostituito con la classe del punto di ingresso principale per il framework ... Ha funzionato. – jowie

+0

Grazie, mi hai salvato la vita! –

11

UIImage (denominato: "Background.png") chiama NSBundle.mainBundle() nella parte interna. Pertanto, il codice sta cercando di trovare la risorsa nel pacchetto dell'app host, non nel bundle dei framework. Per caricare UIImage dall'uso fascio del framework questo frammento:

let frameworkBundle = NSBundle(forClass: YOURFRAMEWORKCLASS.self) 
let imagePath = frameworkBundle.pathForResource("yourImage.png", ofType: "") 
if imagePath != nil { 
    result = UIImage(contentsOfFile: imagePath!) 
} 

Modificato: spiegazione aggiunto (thx a milz)

+2

Mentre la vostra risposta può risolvere il problema, è sempre meglio se è possibile fornire una descrizione di ciò che il problema era e come la vostra risposta risolve. Questo è un suggerimento per migliorare ulteriormente questa e le future risposte. –

+3

aggiunta spiegazione – Renatus

+1

Probabilmente non dovresti usare il nome dell'immagine con l'estensione qui 'yourImage.png' - vuoi che UIKit scelga tra @ 2, @ 3 ecc. – Zorayr

0

La risposta accettata non ha funzionato per me. Ecco un modo infallibile per il caricamento di un'immagine incorporata in un quadro dinamico:

var bundle = NSBundle(forClass: self.classForCoder) 

    if let bundlePath = NSBundle(forClass: self.classForCoder).resourcePath?.stringByAppendingString("/MYLIB.bundle"), resourceBundle = NSBundle(path: bundlePath) { 
     bundle = resourceBundle 
    } 

    let image = UIImage(named: "my-embedded-image", inBundle: bundle, compatibleWithTraitCollection: nil) 
2

In Swift 3.0:

let currentBundle = Bundle(for: YOURCLASS.self) 
guard let path = currentBundle.path(forResource: imageName, ofType: "jpg") else { return defaultImage } 
return UIImage(contentsOfFile: path) ?? defaultImage 
1

Un'altra opzione consiste nell'assegnare l'identificatore bundle, il che rende più senso di classe assegnando quando arriva alla leggibilità.

In Swift 3:

UIImage(named: "MyImage", in: Bundle(identifier: "bundleIdentifier"), compatibleWith: nil)