49

以下を使用して手動でデータ構造を作成していました。

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);

これはついに私を完全に狂気に駆り立てています。助けてください!

よろしくお願いします

4

8 に答える 8

121
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
contentDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];

その答えは正しいです。あなたのファイルがアプリにあると確信していますか? それをプロジェクトに追加し、アプリ バンドルにコピーされるかどうかを確認しましたか? そうでない場合は、ビルドしているターゲットにファイルが追加されていない可能性があります。これは、特に複数のターゲットがある場合に起こりやすい間違いです。

于 2009-04-15T05:56:17.347 に答える
4

この問題が発生しましたが、pListの結果を辞書であるはずの配列に入れていたため、機能しませんでした。

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"VehicleDetailItems" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
于 2012-05-17T13:56:48.103 に答える
4

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];
于 2011-06-07T12:45:22.777 に答える
2

完全を期すために、ケンドールとベントフォードは完全に正しいです。ただし、私のサンプルでは、​​contentArray はプロパティであり、arrayWithContentsOfFile が自動解放オブジェクトを作成するため、メソッドの終わりまでに範囲外になりまし

これを正しく機能させるには、次の 3 つのことを行う必要がありました。

  1. ファイルをリソースフォルダーに配置します

  2. ファイルに正しい名前を付けます (league.plist の代わりに Leagues.plist でした)

  3. [[NSArray alloc] initWithContentsOfFile:plistPath)]を使用してファイルを読み取ります。

3番目の部分は、この関数のスコープを終了しても解放されない割り当てられた NSArray を作成します...もちろん、これは dealloc 関数で解放する必要がありました。

于 2009-04-17T08:50:31.963 に答える
0

追加するだけです。同じ問題が発生し、提案された解決策が問題の解決に役立ちましたが、実際に正確な解決策を使用したかどうかはわかりません。私の場合、問題は.plistファイルが別のターゲットに追加されたことでした(少し前に新しいターゲットを追加していました)。したがって、解決策は.plist> Get Info> Targetsであり、インストール時にデバイスにコピーされるように、正しいターゲットに追加されていることを確認してください。ダーンは、私がすぐに多くの時間を節約できたであろうことを理解していました。これもお役に立てば幸いです。よろしく!

于 2009-08-28T06:08:38.157 に答える
0

このコードは機能しています

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plist-name" ofType:@"plist"];
NSDictionary *Dictionary= [[NSDictionary alloc]initWithContentsOfFile:plistPath];
NSLog(@" current version CFBundleVersion = %@",[Dictionary valueForKey:@"CFBundleVersion"]);
于 2013-02-14T10:16:29.047 に答える
0

ファイルがリソース フォルダーに追加されず、ドキュメント ディレクトリにのみ配置されている場合。あなたはこれを行うことができます

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"file.plist"];
NSMutableArray *arrContentsplist = [[NSMutableArray alloc] initWithContentsOfFile:path];
于 2013-01-10T12:53:36.363 に答える