arrayWithFile返回0的计数

时间:2012-05-04 10:23:29

标签: objective-c xcode nsmutablearray

我正在编写一个应用程序,将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 个答案:

答案 0 :(得分:1)

通常这是因为默认情况下,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">
<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>

其中根元素是一个数组。您现在可以照常编辑。

答案 1 :(得分:0)

使用Xcode打开plist文件。

只需找到左上角的'键'和plist的Type

Sample Plist file

确保Type是数组。

答案 2 :(得分:0)

我认为你的plist是一个包含数组的字典 试试这个

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:listPath]
NSArray *array = [dict objectForKey:@"key"];

答案 3 :(得分: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>    

现在,您的问题有2个解决方案。

  1. 将内容放入字典中,然后取出特定键的数组。
  2. 使用文本编辑器打开plist并将根密钥更改为root,然后将root更改为。如果您的plist是静态的并且在bundle资源中,那么您可以这样做但如果它是由您的代码生成的plist,那么我不会推荐这个。