2014-10-19 12 views
5

Aby udostępnić kod i zasobów między mojej aplikacji i rozszerzeń, I osadzić Cocoa Touch Framework w moim projekcie, to framework zawiera pewne zasoby, takie jak obraz i plików XIB.iOS 8: uzyskać zasób z kakao ram dotykowym

Moje pytanie brzmi: w jaki sposób mogę uzyskać dostęp do tych zasobów od maja głównej aplikacji i rozszerzeń?

Ja używałem tej metody: iOS 8 Extension: how to use xib inside Cocoa Touch Framework in extensions?

ale to zrobić kopię do wszystkich zasobów w aplikacji pakietu oraz pakiet rozszerzeń, co nie jest dobrym powtarzać.

Czy istnieje lepszy sposób?

Aktualizacja:

Teraz moim głównym aplikacja może użyć kodu tak, aby uzyskać dostęp do zasobów w ramach:

+(NSBundle*)frameworkBundle 
{ 
    NSString *frameworkDirPath = [[NSBundle mainBundle] privateFrameworksPath]; 
    NSString *frameworkBundlePath = [frameworkDirPath stringByAppendingPathComponent:@"MyFramework.framework"]; 
    NSBundle *frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath]; 

    return frameworkBundle; 
} 

ale to nie działa dla rozszerzeń.

Odpowiedz

15

Spróbuj tego:

NSBundle *frameworkBundle = [NSBundle bundleForClass:[AnyClassFromFramework class]]; 
+0

To rzuca inną trasą niż kod, który jest w pytaniu, dlaczego? co powinniśmy użyć? – Gabox

+0

Tworzenie pakietu za pomocą opcji bundleForClass jest lepsze niż tworzenie ścieżki. I wobec tego problemu podczas rozwoju, w którym się zużywa CoreData plik momd z testu aplikacji, po czym przekształca się aplikację do ramy i dodano momd jako surowca. Teraz aplikacja testu, który zużywa plik momd szukał go w mainBundle, natomiast teraz jest nieprawidłowy. plik momd jest przenoszony wewnątrz struktury. Dlatego zawsze używaj bundleForClass i dostarczaj klasę najbliższą/bezpośrednio korzystającą z zasobu. – Omkar

5

Ten pracował dla mnie:

NSBundle * frameworkBundle = [NSBundle bundleWithIdentifier:@"<framework-bundle-identifier>"]; 
+0

Działa to tylko dla biblioteki dynamicznej, dla biblioteki statycznej zwraca zero. – njuxjy

0

Dla szybkiej, należy rozważyć użycie:

let bundle = NSBundle(forClass: self.dynamicType) 
+0

Dotyczy tylko modelu Swift 3+. – emrekyv