web-dev-qa-db-ja.com

pathForResourceはnullを返します

プロジェクトにいくつかの.applescriptファイルをロードしようとしています。

次のように、それらを「サポートファイル」ディレクトリにコピーしました。

enter image description here

そしてそれらにアクセスしようとしました:

NSBundle *bundle = [NSBundle mainBundle];
NSLog(@"Resource path for test.applescript: %@", [bundle pathForResource:@"test" ofType:@"applescript"]);

pathForResourceは常にnullを返します。

どちらのファイルもxcodeに正しくインポートされます。ターゲットメンバーシップは私のアプリです。同様の質問の解決策は本当に役に立たなかった

何が悪いのですか?

41
dvcrn

Xcodeターゲットの「Build Phases」で、「Copy Bundle Resources」の下にファイルを追加します。

152
zaph

まだnilパスを取得していて、ファイルが「バンドルリソースのコピー」に追加されているすべてのユーザーは、ファイルをバンドルリソースのコピーから削除してから、再度追加してください。

5
Ahmad Ishfaq

上記のZaphからのすばらしい反応ですが、少なくともXcode 6.1では、それを行う方が速い方法であることに気付きました。

ファイル(test.applescriptなど)をシングルクリックしてXcodeの右メニューを開くと、「ターゲットメンバーシップ」というセクションが表示されます。適切なターゲット(スクリプトを使用しているターゲットなど)が選択されていることを確認します。これにより、「バンドルリソースのコピー」でファイルを追加するのと同じジョブが実行されます。

また、完全に関連しているわけではありませんが、複数の異なる場所からロードしている場合、またはこのクラスを継承している場合に備えてください。あなたは本当に使うべきではありません

[NSBundle mainBundle];

代わりに使用

[NSBundle bundleForClass:[self class]];

つまり、実行中のターゲットに関連付けられた適切なアイテムからリソースを取得するメソッド呼び出しのどこにいるかを気にする必要はありません。ライブラリの作成や再利用可能な呼び出しに最適です;)

1
agovan

あなたの画像は、そのファイルがあるフォルダにあると想定していますか?

この場合はpathForResource:ofType:inDirectory:メソッドを試してください:

NSLog(@"Resource path for test.applescript: %@", [bundle pathForResource:@"test" ofType:@"applescript" inDirectory:@"folder/Supporting Files");
0
beryllium

Zaphの発言に加えて、「リリース」モードで実行していないことを確認してください。

その設定を元に戻すのを忘れて、シンボルが取り除かれて、NSBundleがパスを解決できなくなった時期がありました。

0
Jon