19

Xcodeで静的ライブラリを作成しました。これは、他のプロジェクトで正常に使用できます。ただし、plistのようなリソースでは、プロジェクトが使用されるメインプロジェクトのライブラリで参照されているplistを含める必要があることがわかりました。

静的ライブラリプロジェクトでは、ターゲットの「バンドルリソースのコピー」フェーズにplistを含めています。私のコードでは、これが私がしていることです:

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

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

mainBundleを使用していて、MyClassParams.plistがメインプロジェクトに含まれている場合、すべて問題ありません。MyClassParams.plistがライブラリプロジェクトに含まれている場合、それは機能しません。

[NSBundle mainBundle]が使用する間違った静的メソッドを参照していると仮定して、次のように置き換えました。

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

これもうまくいきませんでした。

それで、静的ライブラリにplistまたは他のリソースを含めることは可能ですか?または、libが使用されるプロジェクトに必要なものを含める必要がありますか?

4

3 に答える 3

18

静的ライブラリはバンドルされていません。アプリケーションにリンクされると、そのアプリケーション バンドルの一部になります。iPhone では、組み込みフレームワークを含めることができないため、事実上、作成するすべてのコードは mainBundle に含まれます。

そうです、静的フレームワークをリンクしているプロジェクトにすべてのリソースをコピーする必要があります。

于 2009-11-02T02:06:41.690 に答える
12

リソース ファイルを静的ライブラリに含めることができないことはわかっています (フレームワークはそうしています)。プロジェクトで別のソリューションを使用しています。

静的ライブラリ「YYY」プロジェクト内:

  • 「Loadable Bundle」ターゲットをスタティック ライブラリ プロジェクトに追加します (Add Target, Cocoa, Loadable Bundle)
  • このターゲットを静的ライブラリ ターゲットの依存関係として追加します

メイン プロジェクト内:

  • リンクlibYYY.a
  • YYY.bundleコピーしたリソース ファイルにバンドルを追加する

このように、スタティック ライブラリで使用されるリソース ファイルは、メイン プロジェクトでは管理されません。foo.png静的ライブラリに写真があるとします。使用します

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

次に、次のように plist を取得できます。

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

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

以下に、2 つのスクリーンショットを示します。

  • : ロード可能なバンドル ターゲットを含むスタティック ライブラリ プロジェクト
  • : 「Link Binary With Libraries」に追加された静的ライブラリ バイナリと、「Copy bundle Resources」に追加されたリソース バンドルを示しています。

静的ライブラリ プロジェクト 主なプロジェクト

于 2010-12-27T14:37:57.130 に答える
2

@Jilocが提案したすべてに従いましたが、バンドルを取得できますが、その中のファイルを取得できませんでした。私は2つの方法の両方を試しました(@"yyy.bundle/image" またはstaticlib pathforresource...

次に、以下の方法を使用しましたが、うまくいきました!

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];
于 2011-07-23T08:41:45.187 に答える