4

私はObjectiveCの初心者であり、次の問題を説明するのに十分な知識がありません。

このコードは機能します:

NSString *plistPath = @"/Users/andrewf/MyApp/Resources/Plates.plist";
dicPlates = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

私の辞書オブジェクトには、期待どおりの値がロードされています。

このコードは機能しません:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Plates" ofType:@"plist"];
dicPlates = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

plistPathはnilの値で返されます。これは、呼び出しにinDirectory:@"Resources"を含めるかどうかに関係なく当てはまります。私が見つけたすべての例には、Resourcesディレクトリで.plistファイルを開こうとしたときにinDirectoryが含まれていません。

ファイルが正しい場所にあることを確認し、確実に再作成しました。

これはとても単純な問題のように思えますが、私は謎に包まれています。手伝ってください。

4

3 に答える 3

12

pathForResource:どこを見ているのか混乱していると思います。

これは機能します:

NSString *plistPath = @"/Users/andrewf/MyApp/Resources/Plates.plist";

このパスはアプリケーションを指していないことに注意してください。プロジェクトディレクトリを指します。plistはにあるはず@/Users/andrewf/MyApp/build/Release/MyApp.app/Resources/Plist.plist"です(iPhoneアプリの場合、これは異なり、より似ています)。これは、探しているアプリ@"/Users/andrewf/Library/Application Support/iPhone Simulator/User/Applicatons/(unique id)/MyApp.app/Resources/Plates.plist"Resourcesフォルダー内にあります。pathForResource:

これが意味するのは、リソースがビルドターゲットの「バンドルリソースのコピー」フェーズにないことです。グループとファイル領域からそのフェーズ内にドラッグする必要があります。

于 2009-11-17T16:08:07.940 に答える
3

問題が見つかりました!

.plist ファイルがターゲットに正しく含まれていました。

.plist が最初に作成されたとき、ファイルに「plates.plist」という名前を付けました。ファイルを作成した直後に、名前を「Plates.plist」に変更し、以降はこれを使用します。

私のリソース フォルダーでは、ファイルの名前は「Plates.plist」でしたが、ターゲット セクションと上記の iPhone シミュレーターの場所では、ファイルの名前は「plates.plist」でした。不思議なことに、ファイルの内容はまだ正しく更新されていました。

「plates.plist」を参照するようにコードを変更し、Resources フォルダー内のファイルの名前を適切に同じ名前に変更したので、すべてが機能します。これは iPhone SDK のバグだとしか思えません。

于 2009-11-17T20:20:31.603 に答える
0

plates.plistXcodeでファイルがターゲットに追加されていることを確認してください。

ファイルがターゲットに追加されていない場合、ファイルはビルド製品内になく、NSBundleはそれを検出しません。

于 2009-11-17T16:03:51.770 に答える