web-dev-qa-db-fra.com

Comment charger une ressource dans cocoapods resource_bundle

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.

17
Joe SHI

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)
32
Quaid

Ç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)
3
Shaheen Ghiassy

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 .

3
Matt Robinson

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. 

 enter image description here

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)
1
jhelzer

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];
0
gklka

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)
0
RomanN

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)
   }
}
0
PrimaryChicken