0

plist を docsdir にコピーし、それを変更可能な配列に読み込むアプリを作成しています。ただし、以下のコードは、配列のカウント 0 を返します。ただし、ディクショナリ ログの行は正しい項目を返します。また、ファイルが docsdir にコピーされていることも確認しました。

-(NSString *)docsDir {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
}


- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *listPath = [[self docsDir]stringByAppendingPathComponent:@"list.plist"];
    if (![[NSFileManager defaultManager]fileExistsAtPath:listPath]) {
        [[NSFileManager defaultManager]copyItemAtPath:[[NSBundle mainBundle]pathForResource:@"list" ofType:@"plist"] toPath:listPath error:nil];
        NSLog(@"Chicken");
    }

    NSLog(@"%@", [NSDictionary dictionaryWithContentsOfFile:listPath]);
    _array = [NSArray arrayWithContentsOfFile:listPath];

    NSLog(@"Count: %i", [_array count]);

}

- (void)viewDidUnload
{
    [super viewDidUnload];
    / / Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
4

4 に答える 4

1

通常、これはデフォルトで plist ファイルのルート要素がディクショナリであるためです。

右クリックしてOpen as Source Codeを選択すると、ファイルは次のようになります。

<?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">
<dict>
    <key>foo</key>
    <array>
        <string>foo1</string>
        <string>foo2</string>
        <string>foo3</string>
    </array>
</dict>
</plist>

ルート要素が dict の場合、次のように変更します。

<?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>
    <string>foo1</string>
    <string>foo2</string>
    <string>foo3</string>
</array>
</plist>

ルート要素は配列です。これで通常どおり編集できます。

于 2012-05-04T11:30:59.250 に答える
0

Xcodeでplistファイルを開きます。

左上隅とTypeplistの「キー」を見つけるだけです。

サンプルPlistファイル

Typeがアレイであることを確認してください。

于 2012-05-04T10:34:55.947 に答える
0

plist は通常、辞書に保存されます。

例を次に示します。

<dict>
    <key>tiltingAnim</key>
    <dict>
        <key>filenamePrefix</key>
        <string>radar_</string>
        <key>delay</key>
        <real>0.25</real>
        <key>animationFrames</key>
        <string>1,2,3,4,5,5,4,3,2,1,2,3,4,5</string>
    </dict>
    <key>takingAHitAnim</key>
    <dict>
        <key>filenamePrefix</key>
        <string>radar_</string>
        <key>delay</key>
        <real>0.1</real>
        <key>animationFrames</key>
        <string>5,5,7,8,8</string>
    </dict>
    <key>blowingUpAnim</key>
    <dict>
        <key>filenamePrefix</key>
        <string>radar_</string>
        <key>delay</key>
    <real>0.2</real>
    <key>animationFrames</key>
    <string>5,6,7,8,9,10,11,12,13,14,15,16,17</string>
    </dict>
    <key>transmittingAnim</key>
    <dict>
        <key>filenamePrefix</key>
        <string>radar_</string>
        <key>delay</key>
        <real>0.3</real>
        <key>animationFrames</key>
        <string>5,6,5,6,5,6,5</string>
    </dict>
</dict>    

さて、あなたの質問には2つの解決策があります。

  1. 内容をディクショナリに取得してから、特定のキーの配列を取り出します。
  2. テキスト エディタで plist を開き、ルート キーを に変更してから、ルートを に変更します。あなたのplistが静的でバンドルリソースにある場合はこれを行うことができますが、それがコードによって生成されたplistである場合、これはお勧めしません.
于 2012-05-04T13:49:28.263 に答える
0

あなたの plist は、配列を含む辞書だと思います。
これを試して

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:listPath]
NSArray *array = [dict objectForKey:@"key"];
于 2012-05-04T10:58:21.053 に答える