次を使用してデータ構造を手動で作成していました。
NSDictionary* league1 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Barclays Premier League", @"name",
@"Premier League", @"shortname",
@"101", @"id", nil];
NSDictionary* league2 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Coca-Cola Championship", @"name",
@"Championship", @"shortname",
@"102", @"id", nil];
NSDictionary* league3 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish Premier League", @"name",
@"SPL", @"shortname",
@"201", @"id", nil];
NSDictionary* league4 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Champions League", @"name",
@"UCL", @"shortname",
@"501", @"id", nil];
contentArray = [[NSArray alloc] initWithObjects:
[[NSDictionary alloc] initWithObjectsAndKeys: @"English", @"category", [[NSArray alloc] initWithObjects: league1, league2, nil], @"leagues", nil],
[[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish", @"category", [[NSArray alloc] initWithObjects: league3, nil], @"leagues", nil],
[[NSDictionary alloc] initWithObjectsAndKeys: @"Tournaments", @"category", [[NSArray alloc] initWithObjects: league4, nil], @"leagues", nil],
nil];
[league1 release];
[league2 release];
[league3 release];
[league4 release];
ただし、ファイルから読み取った方が良いと思いました。そこで、次の構造を持つファイルleagues.plistを作成しました。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>category</key>
<string>English</string>
<key>leagues</key>
<array>
<dict>
<key>name</key>
<string>Barclays Premier League</string>
<key>shortname</key>
<string>Premier League</string>
<key>id</key>
<string>101</string>
</dict>
<dict>
<key>name</key>
<string>Coca-Cola Championship</string>
<key>shortname</key>
<string>Championship</string>
<key>id</key>
<string>102</string>
</dict>
</array>
</dict>
<dict>
<key>category</key>
<string>Scottish</string>
<key>leagues</key>
<array>
<dict>
<key>name</key>
<string>Scottish Premier League</string>
<key>shortname</key>
<string>SPL</string>
<key>id</key>
<string>201</string>
</dict>
</array>
</dict>
<dict>
<key>category</key>
<string>Tournaments</string>
<key>leagues</key>
<array>
<dict>
<key>name</key>
<string>Champions League</string>
<key>shortname</key>
<string>UCL</string>
<key>id</key>
<string>501</string>
</dict>
</array>
</dict>
</array>
</plist>
このファイルを読み込むにはどうすればよいですか。さまざまな方法を試しましたが、何も機能しませんでした。ファイルの正しい場所を探しているかどうかさえわかりません。参考のために、次の方法を試しています。
NSString* errorDesc = nil;
NSPropertyListFormat format;
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
NSData* plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
contentArray = (NSArray*)[NSPropertyListSerialization
propertyListFromData:plistXML
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&errorDesc];
if (!contentArray) {
NSLog(errorDesc);
[errorDesc release];
}
または
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
contentArray = [NSArray arrayWithContentsOfFile:plistPath];
または
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *fooPath = [documentsPath stringByAppendingPathComponent:@"leagues.plist"];
NSLog(fooPath);
contentArray = [NSArray arrayWithContentsOfFile:fooPath];
NSLog(@"%@",contentArray);
これは最終的に私を完全に狂気に駆り立てています。助けてください!
ありがとう
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
contentDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];
その答えは正しいです-あなたのファイルがアプリにあると確信していますか?プロジェクトに追加し、アプリバンドルにコピーされるかどうかを確認しましたか?そうでない場合は、ビルド中のターゲットにファイルが追加されていない可能性があります。特に、複数のターゲットがある場合は、簡単な間違いです。
plist
がプロジェクトのリソースフォルダーにある場合、このコードを使用します。
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
contentArray = [NSArray arrayWithContentsOfFile:sourcePath];
plist
がアプリのドキュメントディレクトリ内にある場合、これを使用します。
NSArray *paths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *plistName = @"league";
NSString *finalPath = [basePath stringByAppendingPathComponent:
[NSString stringWithFormat: @"%@.plist", plistName]];
contentArray = [NSArray arrayWithContentsOfFile:finalPath];
私はこの問題を抱えていましたが、pListからの結果を辞書でなければならない配列に入れていたので、それはうまくいきませんでした、すなわち
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"VehicleDetailItems" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
完全を期すために、ケンドールとベントフォードは完全に正しいです。ただし、私のサンプルでは、contentArrayはプロパティであり、メソッドの終わりまでにarrayWithContentsOfFileが自動リリースされたオブジェクトを作成するため、スコープから外れていました。
これを正しく機能させるには、3つのことを行う必要がありました。
ファイルをリソースフォルダーに入れます
ファイルに正しく名前を付けます(league.plistではなくleagues.plistでした)
[[NSArray alloc] initWithContentsOfFile:plistPath)];を使用してファイルを読み取ります
3番目の部分は、この関数のスコープを終了しても解放されないNSArrayを作成します。もちろん、これはdealloc関数で解放する必要がありました。
ケンドールは正しいです。
私の経験では、xcodeの「Resources」フォルダーにファイルを追加する必要があります。
追加するだけです。同じ問題があり、提案された解決策が問題の解決に役立ちましたが、実際に正確な解決策を使用したかどうかはわかりません。私の場合、問題は.plistファイルが別のターゲットに追加されたことです(少し前に新しいターゲットが追加されていました)。したがって、解決策は.plist> Get Info> Targetsで、正しいターゲットに追加されていることを確認して、インストール時にデバイスにコピーされるようにしました。ダーンは、私が多くの時間を節約できるだろうとすぐに理解しました。これも役立つことを願っています。よろしく!
このコードは機能しています
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plist-name" ofType:@"plist"];
NSDictionary *Dictionary= [[NSDictionary alloc]initWithContentsOfFile:plistPath];
NSLog(@" current version CFBundleVersion = %@",[Dictionary valueForKey:@"CFBundleVersion"]);
ファイルがリソースフォルダーに追加されず、ドキュメントディレクトリにのみ配置される場合。あなたはこれを行うことができます
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"file.plist"];
NSMutableArray *arrContentsplist = [[NSMutableArray alloc] initWithContentsOfFile:path];