2009-11-01 7 views
18

Ich habe eine statische Bibliothek in Xcode erstellt, die ich erfolgreich in anderen Projekten verwenden kann. Bei Ressourcen wie plists finde ich jedoch, dass ich alle in meiner Bibliothek referenzierten Plisten in das Hauptprojekt einbeziehen muss, in dem das Projekt verwendet wird.NSBundle, plist und andere Ressourcen in einer Obj-c statischen Bibliothek

In meinem statischen Bibliotheksprojekt habe ich meinen Plist in die Phase "Copy Bundle Resources" des Ziels aufgenommen. In meinem Code, hier ist, was ich tue:

NSBundle *mainBundle = [NSBundle mainBundle]; 
NSString *filePath = [mainBundle pathForResource:@"MyClassParams" ofType:@"plist"]; 

NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 

Wenn ich Main und die MyClassParams.plist ist im Hauptprojekt enthalten verwenden, ist alles gut. Wenn MyClassParams.plist im Bibliotheksprojekt enthalten ist, funktioniert es nicht.

NSBundle *mainBundle = [NSBundle bundleForClass:[MyClass class]]; 

Diese Arbeit hat auch nicht:

Unter der Annahme, dass [NSBundle Main] wurde die falsche statische Methode verweisen, ich habe es mit Fassung zu verwenden.

Also, ist es möglich, ein plist oder andere Ressourcen mit einer statischen Bibliothek zu integrieren - oder muss ich alles, was ich brauche, in das Projekt einbeziehen, in dem die lib verwendet wird?

+0

Starten eines Kopfgeldes mit der Frage - ist die akzeptierte Antwort immer noch korrekt von iOS 4.2? –

Antwort

17

Statische Bibliotheken sind keine Bundles, wenn sie in eine Anwendung eingebunden werden, sind sie Teil dieses Anwendungsbündels. Auf dem iPhone wird der gesamte Code, den Sie schreiben, im mainBundle enthalten sein, da Sie keine eingebetteten Frameworks einschließen können.

Also ja, Sie müssen alle Ressourcen in das Projekt kopieren, in das Sie das statische Framework einbinden.

+0

Danke für die Antwort. – Vickram

12

Ich weiß, dass Sie keine Ressourcendateien in eine statische Bibliothek aufnehmen können (das ist, was Frameworks tun). ich eine andere Lösung in meinen Projekten verwenden:

Innerhalb des statischen Bibliothek „YYY“ Projektes:

  • ich ein „ladbarer Bundle“ Ziel meines statischen Bibliothek-Projekt hinzufügen (Ziel hinzufügen, Kakao, ladbare Bundle)
  • ich hinzufügen, um dieses Ziel als eine Abhängigkeit des statischen Bibliothek Ziels

im Hauptprojekt:

  • Link, um die libYYY.a
  • das Bündel hinzufügen YYY.bundle auf die kopierten Ressourcendateien

Auf diese Weise Ressourcendateien in der statischen Bibliothek verwendet werden, nicht in dem Hauptprojekt verwaltet.Sagen, dass ich ein foo.png Bild in der statischen Bibliothek, ich

[UIImage imageNamed:@"YYY.bundle/foo.png"] 

verwenden Sie dann Ihre plist wie diese bekommen konnte:

NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]]; 
NSString *filePath = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"]; 

NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 

Unten zwei Screenshots:

  • links: statisches Bibliotheksprojekt mit ladbarem Bündel Ziel
  • rechts: zeigt die statische Bibliothek, die zu "Link Binary With Libraries" hinzugefügt wurde, und das Ressourcenpaket, das zu "Copy bundle Resources" hinzugefügt wurde.

Static library project Main project

+0

Hallo Jilouc. . Ich bin mit dem letzten Schritt festgefahren. Was ist kopierte Ressourcendateien? . plz erklären – thndrkiss

+1

@thdrkiss Ziehen Sie einfach die Bundle-Datei zu Ihnen Ressourcen (wie Sie für jede andere Ressource-Datei tun würden) und fügen Sie es zu Ihrem Projekt Ziel. Ich habe einen Screenshot hinzugefügt. – Jilouc

+0

danke Kumpel. .es funktionierte ! . . – thndrkiss

2

folgte ich alles @Jilouc vorgeschlagen, aber ich das Bündel bekommen kann aber nicht darin enthaltenen Dateien zu bekommen. Ich probierte beide Wege (@"yyy.bundle/image" oder staticlib pathforresource...)

Dann habe ich die Methode unten verwendet und es hat funktioniert!

NSBundle *staticBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"yy.bundle"]]; 

NSString *filePath = [[jsBundle resourcePath]stringByAppendingPathComponent:fileName]; 

NSString* content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];