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>

其中根元素是一个字典,将其更改为:

<?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 是一个包含数组的字典。
试试这个

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

Plists 通常保存在字典中:

这是一个例子:

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

现在,您的问题有两种解决方案。

  1. 要么将内容放入字典,然后取出特定键的数组。
  2. 使用文本编辑器打开 plist 并将 root 键更改为然后将 root 更改为 . 如果您的 plist 是静态的并且在捆绑资源中,那么您可以这样做,但如果它是您的代码生成的 plist,那么我不推荐这样做。
于 2012-05-04T13:49:28.263 回答