2016-02-29 9 views
10

Mam wiele do rozwiązania, aby załadować zasób w cocoapods resource_bundle.Jak załadować zasób w cocoapods resource_bundle

Poniżej zamieszczam plik .podspecs.

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

To jest to, co próbuję zrobić z głównego projektu.

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

Zrobiłem to zdjęcie w XDCoreLib.bundle, ale zwraca zero.

+0

Nie rób tego, wystarczy skopiować te zasoby do projektu, ponieważ zasoby te mogą być w strąkach zaktualizowane/usunięte w dowolnym momencie. –

+1

Ta kapsuła jest obsługiwana przez nas. Rozmiar projektu jest coraz większy i chcemy oddzielić każdy moduł. –

Odpowiedz

16

Przez jakiś czas zmagałem się z podobnym problemem. Pakiet zasobów dla kapsuły to w rzeczywistości osobny pakiet, z którego pochodzi kod. Spróbuj wykonać następujące czynności:

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

Świetnie! Brakuje mi "URLByAppending", dziękuję –

+0

@Quaid Czym jest XDWebViewController.self w pierwszej linii – Siddh

+0

@Siddh 'XDWebViewController.self' powinien być klasą wewnątrz bloku. –

0

Ciekawe jest to, kiedy trzeba to zrobić w plikach źródłowych, które są również w bibliotece cocoapod wychodził, kiedy użył XIb i plist pliki w moim kapsuły.

Zostało to rozwiązane w następnej kolejności. Przykład ładowania pliku Xib:

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

Nie sądzę, że jakakolwiek inna odpowiedź opisała związek z Podspec. Adres URL pakietu używa nazwy modułu, a następnie .bundle, aby znaleźć pakiet zasobów. To podejście działa z katalogami zasobów w celu uzyskania dostępu do obrazów na strąkach zarówno wewnątrz, jak i na zewnątrz zestawu.

Podspec

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

Cel 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

Patrz this answer.

0

Tylko dla przypomnienia: chciałem otworzyć NIB z kategorii przechowywanej w bibliotece CocoaPods. Oczywiście [self classForCoder] cofnął (z powodu Kategorii) UIKit, więc powyższe metody nie zadziałały.

I rozwiązany przy użyciu niektórych jawnie wpisanej ścieżki:

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

To będzie działać

W .podspec dodać s.resources oprócz s.resource_bundles (pod install potem)

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

Następnie w kodzie , tak proste jak:

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

Możesz po prostu sprawdzić identyfikator pakietu, wybierając projekt Pods, wybierając żądany cel i upewniając się, że jesteś na karcie Ogólne.

enter image description here

Następnie w kodzie można załadować powiedzieć obrazu w tej Pod tak:

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