iOS:使用plist中的项目播种应用程序

时间:2013-05-18 14:29:53

标签: ios nsarray plist appdelegate

我正在尝试使用下一个方法在某些项目中填充或播种我的应用程序,该方法在didFinishLaunchingWithOptions方法中调用:

    -(void)seedItems {
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    if (![ud boolForKey:@"MUserDefaultsSeedItems"]) {
        // Load seed items
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"seed" ofType:@"plist"];
        NSArray *seedItems = [NSArray arrayWithContentsOfFile:filePath];
        NSMutableArray *items = [NSMutableArray array];
        for (int i = 0; i < [seedItems count]; i++) {
            NSDictionary *seedItem = [items objectAtIndex:i];
            MShoppingItem *shoppingItem = [MShoppingItem createShoppingItemWithName:[seedItem objectForKey:@"name"] andPrice:[[seedItem objectForKey:@"price"] floatValue]];
            [items addObject:shoppingItem];
        }

        // Items path
        NSString *itemsPath = [[self documentsDirectory] stringByAppendingPathComponent:@"items.plist"];

        // Write to file
        if ([NSKeyedArchiver archiveRootObject:items toFile:itemsPath]) {
            [ud setBool:YES forKey:@"MUserDefaultsSeedItems"];
        }
    }
}

文件seed.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>name</key>
        <string>Naranjas</string>
        <key>price</key>
        <integer>0</integer>
    </dict>
    <dict>
        <key>name</key>
        <string>Peras</string>
        <key>price</key>
        <integer>0</integer>
    </dict>
    <dict>
        <key>name</key>
        <string>Manzanas</string>
        <key>price</key>
        <integer>0</integer>
    </dict>
</array>
</plist>

问题在于,在执行NSArray *seedItems = [NSArray arrayWithContentsOfFile:filePath];时,它表示数组包含3个对象,但它们是Out of scopeSummary Unavailable

请问,好吗?

提前多多感谢!

1 个答案:

答案 0 :(得分:0)

获得filePath后,使用NSFileManager检查它是否存在。如果它不存在,请检查该文件是否已正确添加到Xcode,并将其设置为应用程序目标的一部分,以便它显示在“复制包资源”构建阶段。您可以通过在Xcode中选择种子文件并在Utilities检查器中查看“Target Membership”来检查目标成员资格。

您对问题的更新表明数组已加载,但在调试器中它被列为不可用。这表明该阵列已被释放(因为它已不再使用)。这表明拼写错误。仔细看看代码,我看到了:

NSDictionary *seedItem = [items objectAtIndex:i];

应该是:

NSDictionary *seedItem = [seedItems objectAtIndex:i];

我猜你以前看到过崩溃了吗?