web-dev-qa-db-ja.com

NSBundle pathForResourceはNULLです

Xcodeとobjcを使用して簡単なアプリケーションを作成しています。ファイルからNSDictionaryをロードする必要がありますが、NSBundleを使用してファイルへのパスを取得できません。

NSString *l = [[NSBundle mainBundle] pathForResource:@"LoginStatuses" ofType:@"plist"];
NSLog(@"%@", l);

このコードを実行すると、次のようになります。

2010-10-16 10:42:42.42サンプル[5226:a0f](null)

そして、その理由はわかりません。

Resourcesというグループを作成し、そこにLogingStatuses.plistを追加しました。 res

37
patrick

したがって、ソースを取得した後のこの問題の解決策は次のとおりです。

投稿されたスクリーンショットにはあまり注意を払いませんでしたが、ターゲットのタイプは「Command-line Tool "...」で、バンドルがないため[NSBundle mainBundle]もちろんnilを返します。 Xcodeが「バンドルリソースのコピー」ステップを実行できないと文句を言わず、単に黙ってスキップするのは、かなり誤解を招きます。

解決策は、タイプ "Application"の新しいターゲットを追加して、バンドルベースのアプリケーションが生成されるようにすることです。次に、この新しいターゲットのすべてのソースとリソースのターゲットメンバーシップチェックボックスをオンにします。 plistパスは正しく解決されます。

63
DarkDust

IPhoneアプリにデフォルトのsqliteデータベースを使用させようとしていましたが、くそアプリはそれを見つけることができませんでした。 .sqliteファイルがバンドルリソースにあることを確認する必要がありました。

  1. プロジェクトを選択してください
  2. ターゲットを選択
  3. [ビルドフェーズ]タブを選択します
  4. 「バンドルリソースのコピー」というラベルのセクションを開きます
  5. .sqliteファイルをこのセクションにドラッグアンドドロップします。

これで、アプリはこのデフォルトのsqliteデータベースを見つけます。

52
fawsha1

ファイルは実際にターゲットに含まれていますか(そのためバンドルにコピーされますか)?それを見つける/設定する2つの方法があります:

最初の方法:ファイルを右クリック(またはCmdキーを押しながらクリック)して、[情報を見る]を選択します。次に、「ターゲット」タブをクリックし、目的のターゲットのファイルがチェックされていることを確認します。

2番目の方法:プロジェクトブラウザーのファイルブラウザーのヘッダーを右クリック(またはCmd-clock)します(「グループとファイル」と表示される可能性が高い)。次に、「ターゲットメンバーシップ」を選択します。これで、ターゲットのメンバーになることができる各ファイルの横にチェックボックスがあります(.mファイルやリソースなど)。繰り返しますが、ファイルの横にあるチェックボックスがオンになっていることを確認してください。

22
DarkDust

私はここでグーグルで答えを見つけなかったが、自分でそれを発見したので、ここに残します...

Retinaの場合、2つのファイルtray.png[email protected]がありました。ファイルは「バンドルリソースのコピー」に自動的に追加されました。

だが:

[[NSBundle mainBundle] pathForResource:@"tray" ofType:@"png"];

実際にバンドルにコピーされたファイルを返しませんでした!その理由は:IDE 1つのTIFFファイルを作成tray.tiff(joint tray.png and [email protected])、したがって... ofType:@"tiff"]助けて!

5
Dmitry Isaev

今日、コマンドラインプロジェクトでこの問題に遭遇しました。

幸いなことに、解決策は簡単です。 「Build Phases」に進み、「+」をクリックして、新しい「Copy Files」フェーズを追加します。 「リソース」を宛先として選択し、使用するファイルを追加します。

これで、[NSBundle mainBundle]そしてそれは動作するはずです!

2
edwardmp

私の問題と解決策は、Dmitriy Isaevの問題と非常によく似ています。 xibファイルのパスを取得しようとしました。 (Swiftで)pathForResource( "myfile"、ofType: "xib")とpathForResource( "myfile.xib"、ofType:nil)の両方の呼び出しが失敗します。

解決策は、代わりに拡張子「nib」を使用することです。

pathForResource("myfile", ofType: "nib")
2
Tony

IPadでは、ファイル名の大文字と小文字が区別されます。小文字を使用する必要があります。

0
János