J'ai eu beaucoup de mal à charger des ressources dans des cocoapodes.
Voici ce que je mets dans le fichier .podspecs
.
s.source_files = 'XDCoreLib/Pod/Classes/**/*'
s.resource_bundles = {
'XDCoreLib' => ['XDCoreLib/Pod/Resources/**/*.{png,storyboard}']
}
C'est ce que j'essaie de faire à partir du projet principal.
let bundle = NSBundle(forClass: XDWebViewController.self)
let image = UIImage(named: "ic_arrow_back", inBundle: bundle, compatibleWithTraitCollection: nil)
print(image)
J'ai vu la photo dans le XDCoreLib.bundle
, mais le résultat est nul.
J'ai lutté avec un problème similaire pendant un moment. Le regroupement de ressources pour un pod est en réalité un regroupement distinct de l'endroit où réside votre code. Essayez ce qui suit:
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)
Ça va marcher
Dans .podspec
, ajoutez s.resources
en plus de s.resource_bundles
(pod install
après)
s.resources = 'XDCoreLib/Pod/Resources/**/*.{png,storyboard}'
Ensuite, dans votre code, c'est aussi simple que:
let image = UIImage(named: "image_name.png", in: Bundle(for: type(of: self)), compatibleWith: nil)
Je ne pense pas que les autres réponses aient décrit la relation avec Podspec. L'URL de l'ensemble utilise le nom du pod, puis .bundle
pour rechercher l'ensemble de ressources. Cette approche fonctionne avec les catalogues d'actifs pour accéder aux images de pod à la fois à l'intérieur et à l'extérieur du pod.
Podspec
Pod::Spec.new do |s|
s.name = 'PodName'
s.resource_bundles = {
'ResourceBundleName' => ['path/to/resources/*/**']
}
end
Objectif 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];
Rapide
Voir cette réponse .
Vous pouvez simplement vérifier l'ID de l'ensemble en sélectionnant le projet Pods, en sélectionnant la cible souhaitée et en vous assurant que vous vous trouvez dans l'onglet Général.
Ensuite, dans le code, vous pouvez charger une image dans ce pod comme suit:
backgroundImageView.image = UIImage(named: "business_fellas", in: Bundle(identifier: "org.cocoapods.StandardLibrary3-0"), compatibleWith: nil)
Pour mémoire, je voulais ouvrir un NIB d’une catégorie stockée dans une bibliothèque CocoaPods. Bien sûr, [self classForCoder]
a retourné UIKit
(à cause de la catégorie), donc les méthodes ci-dessus ne fonctionnaient pas.
J'ai résolu le problème en utilisant des chemins codés en dur:
NSURL *bundleURL = [[[NSBundle mainBundle] resourceURL] URLByAppendingPathComponent:@"Frameworks/MyCocoaPodLibraryName.framework"];
NSBundle *podBundle = [NSBundle bundleWithURL:bundleURL];
CustomView *customView = [[podBundle loadNibNamed:@"CustomView" owner:self options:nil] firstObject];
Ce qui est intéressant, c’est quand vous devez le faire dans les fichiers sources qui sont également dans la bibliothèque cocoapod Je suis confronté à cela lorsqu’on utilise un xib et des fichiers plist dans mon pod.
Cela a été résolu de la manière suivante. Exemple de chargement d'un fichier xib:
let bundle = Bundle(for: self.classForCoder)
let viewController = CocoapodViewController(nibName: "CocoapodViewController", bundle: bundle)
Peut créer une extension pour accéder plus facilement au bundle de framework dans votre code source de framework
extension Bundle {
static func getResourcesBundle() -> Bundle? {
let bundle = Bundle(for {your class}.self)
guard let resourcesBundleUrl = bundle.resourceURL?.appendingPathComponent({bundle name}) else {
return nil
}
return Bundle(url: resourcesBundleUrl)
}
}