2016-02-29 9 views
10

Ho faticato molto su come caricare la risorsa in cocoapods resource_bundle.Come caricare la risorsa in cocoapod resource_bundle

Quanto segue è ciò che ho inserito nel file .podspecs.

s.source_files = 'XDCoreLib/Pod/Classes/**/*' 
s.resource_bundles = { 
'XDCoreLib' => ['XDCoreLib/Pod/Resources/**/*.{png,storyboard}'] 
} 

Questo è quello che sto cercando di fare dal progetto principale.

let bundle = NSBundle(forClass: XDWebViewController.self) 
let image = UIImage(named: "ic_arrow_back", inBundle: bundle, compatibleWithTraitCollection: nil) 
print(image) 

ho visto l'immagine nel XDCoreLib.bundle, ma restituisce un nullo.

+0

Non farlo, basta copiare queste risorse nel progetto, perché queste risorse in cialde possono essere aggiornato/rimosso in qualsiasi momento. –

+1

Questo pod è gestito da noi stessi. Le dimensioni del progetto sono sempre più grandi e vogliamo separare ogni modulo. –

risposta

16

Ho lottato con un problema simile per un po '. Il bundle di risorse per un pod è in realtà un bundle separato da dove risiede il tuo codice. Provare quanto segue:

let frameworkBundle = NSBundle(forClass: XDWebViewController.self) 
let bundleURL = frameworkBundle.resourceURL?.URLByAppendingPathComponent("XDCoreLib.bundle") 
let resourceBundle = NSBundle(URL: bundleURL!) 
let image = UIImage(named: "ic_arrow_back", inBundle: resourceBundle, compatibleWithTraitCollection: nil) 
print(image) 
+0

Grande! Mi manca "URLByAppending", grazie –

+0

@Quaid Cos'è XDWebViewController.self nella prima riga – Siddh

+0

@Siddh "XDWebViewController.self" dovrebbe essere una classe all'interno del pod. –

0

cosa interessante è quando hai bisogno di farlo in file di origine che si trovano anche nella biblioteca cocoapod ho affrontato quando ha utilizzato un file XI ter e plist nel mio pod.

Questo è stato risolto nel modo successivo. Esempio di caricamento di un file XI ter:

let bundle = Bundle(for: self.classForCoder) 
let viewController = CocoapodViewController(nibName: "CocoapodViewController", bundle: bundle) 
1

Non credo che nessuna delle altre risposte hanno descritto il rapporto con il Podspec. L'URL del gruppo utilizza il nome del pod e quindi .bundle per trovare il pacchetto di risorse. Questo approccio funziona con i cataloghi delle risorse per accedere alle immagini dei pod sia all'interno che all'esterno del pod.

Podspec

Pod::Spec.new do |s| 
    s.name    = 'PodName' 
    s.resource_bundles = { 
    'ResourceBundleName' => ['path/to/resources/*/**'] 
    } 
end 

Objective-C

// grab bundle using `Class` in pod source (`self`, in this case) 
NSBundle *bundle = [NSBundle bundleForClass:self.classForCoder]; 
NSURL *bundleURL = [[bundle resourceURL] URLByAppendingPathComponent:@"PodName.bundle"]; 
NSBundle *resourceBundle = [NSBundle bundleWithURL:bundleURL]; 
UIImage *podImage = [UIImage imageNamed:@"image_name" inBundle:resourceBundle compatibleWithTraitCollection:nil]; 

Swift

Vedi this answer.

0

Solo per la cronaca: volevo aprire un NIB da una categoria memorizzata in una libreria CocoaPods. Ovviamente [self classForCoder] ha restituito UIKit (a causa della categoria), quindi i metodi di cui sopra non hanno funzionato.

ho risolto il problema utilizzando alcuni percorsi hardcoded:

NSURL *bundleURL = [[[NSBundle mainBundle] resourceURL] URLByAppendingPathComponent:@"Frameworks/MyCocoaPodLibraryName.framework"]; 
NSBundle *podBundle = [NSBundle bundleWithURL:bundleURL]; 

CustomView *customView = [[podBundle loadNibNamed:@"CustomView" owner:self options:nil] firstObject]; 
2

Ciò funzionerà

In .podspec aggiungere s.resources oltre a s.resource_bundles (pod install seguito)

s.resources = 'XDCoreLib/Pod/Resources/**/*.{png,storyboard}' 

Poi nel codice , è facile come:

let image = UIImage(named: "image_name.png", in: Bundle(for: type(of: self)), compatibleWith: nil) 
0

È sufficiente controllare l'ID del pacchetto selezionando il progetto Pods, selezionando il target desiderato e assicurandosi di essere nella scheda Generale.

enter image description here

Poi nel codice è possibile caricare un'immagine dire in che Pod in questo modo:

backgroundImageView.image = UIImage(named: "business_fellas", in: Bundle(identifier: "org.cocoapods.StandardLibrary3-0"), compatibleWith: nil)