Как загрузить ресурс в cocoapods resource_bundle

Я много боролся с тем, как загружать ресурс в cocoapods resource_bundle.

Следующее - это то, что я вложил в файл .podspecs.

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

Это то, что я пытаюсь сделать из основного проекта.

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

Я видел изображение в XDCoreLib.bundle, но он возвращает нуль.

Ответ 1

Я некоторое время боролся с подобной проблемой. Пакет ресурсов для контейнера - это фактически отдельный пакет, из которого живет ваш код. Попробуйте следующее:

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)

Ответ 2

Я не думаю, что любой из других ответов описал связь с Podspec. URL-адрес связки использует имя модуля, а затем .bundle, чтобы найти пакет ресурсов. Этот подход работает с каталогами ресурсов для доступа к изображениям контейнера как внутри, так и снаружи модуля.

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

См. этот ответ.

Ответ 3

Это будет работать

В .podspec добавьте s.resources в дополнение к s.resource_bundles (после pod install)

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

Тогда в вашем коде это так же просто, как:

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

Примечание: вам может потребоваться запустить pod install после обновления .podspec чтобы изменения в вашем проекте Xcode

Ответ 4

Вы можете просто проверить идентификатор Bundle, выбрав проект Pods, выбрав желаемую цель и убедитесь, что находитесь на вкладке General.

введите описание изображения здесь

Затем в коде вы можете загрузить изображение в этом Pod так:

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

Ответ 5

Может создать расширение для более легкого доступа к комплекту фреймворка в исходном коде фреймворка

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

Ответ 6

Интересно, когда вам нужно сделать это в исходных файлах, которые также находятся в библиотеке cocoapod Я столкнулся с этим при использовании файлов xib и plist в моем контейнере.

Это было решено следующим образом. Пример загрузки файла xib:

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

Ответ 7

Только для записи: я хотел открыть NIB из категории, хранящейся в библиотеке CocoaPods. Конечно, [self classForCoder] дал UIKit назад (из-за категории), поэтому вышеупомянутые методы не сработали.

Я решил проблему, используя некоторые жестко заданные пути:

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

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

Ответ 8

Кажется, по какой-то причине шаблон **/*. {Extensions} требуется, чтобы это работало. Я закончил тем, что создал свой подспец как

s.resource_bundle = { '<BundleName>' => 'Pod/Resources/**/*.storyboard' }
s.resource = 'Pod/Resources/**/*.storyboard'

хотя мой настоящий путь - Pod/Resources/.storyboard *

И затем, чтобы найти свой пакет, я использовал ответ @Jhelzer, хотя любой способ получить пакет, например, по классу или URL-адресу или идентификатору пакета, будет работать после установки выше.

Вы также можете заглянуть в этот ответ для получения дополнительных ссылок.