Как загрузить ресурс в 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-адресу или идентификатору пакета, будет работать после установки выше.
Вы также можете заглянуть в этот ответ для получения дополнительных ссылок.