【问题标题】:Error while creating an nsarray from plist?从 plist 创建 nsarray 时出错?
【发布时间】:2009-07-30 19:07:08
【问题描述】:

我正在尝试从 .plist 文件创建 NSArray,但我不断收到此错误:

'NSUnknownKeyException', reason: '[<NSCFString 0x5bbca60> valueForUndefinedKey:]: this class is not key value coding-compliant for the key Value1.'

在 .plist 文件中,我有一个名为“Item 1”的键和一个名为“Value1”的字符串值。 然后在代码中,我从该文件创建了一个 NSArray:

-(void)recordValues:(id)sender {

    // read "propertyList.plist" values
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"propertyList" ofType:@"plist"];
    originalArray = [[NSArray alloc] initWithContentsOfFile:plistPath];

   // dump the contents of the array to the log
    for (id key in originalArray) {
        NSLog(@"bundle: key=%@, value=%@", key, [originalArray valueForKey:key]);
    }

    //create an NSMutableArray containing the
    //user's score and the values from originalArray
    NSMutableArray *newArray = [NSMutableArray arrayWithObjects:[NSNumber numberWithFloat:userScore], nil];
    [newArray addObjectsFromArray:array];

    //write xml representation of mutableArray back to propertyList
    [newArray writeToFile:plistPath atomically:NO];

}

    }

【问题讨论】:

  • 说实话,我只是不知道你想做什么。请用更精确的语言?
  • 当然!我有一个属性列表,它是一个数组。这些基本上就像游戏中的高分。当有人玩游戏时,我会将他们的分数添加到一个全新的 NSMutableArray 中。然后我将这个新的可变数组与我的属性列表中的高分结合起来,并将整个集合写回原始 plist 文件。但我得到一个错误,我不知道为什么。这有意义吗?
  • 我忘记了我在其中留下了一个旧变量,如果您不知道该应用程序的功能,这没有任何意义。 :) 对不起。修好了。
  • 仅供参考,如果您这样做,您可以简化代码并使用单个变量:NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:plistPath]; 就目前而言,您正在泄漏originalArray

标签: iphone objective-c cocoa-touch nsarray


【解决方案1】:

数组没有键(它们不需要任何键,因为它们的元素由它们的索引寻址),只有字典由键值对组成。试试:

for (id value in originalArray) {
            NSLog(@"bundle: value=%@", value);
    }

【讨论】:

    【解决方案2】:

    在您的for 循环中,您将originalArray 用作字典。如果你的 plist 的根是字典,你应该使用NSDictionary,而不是NSArray 来阅读它。

    【讨论】:

    • 根是一个 NSArray。那我怎么把它读成 NSArray 呢?我需要添加值,我无法使用 NSDictionary 添加值。
    • 没错,如果根是“Array”,那么您可以使用 NSArray 或 NSMutableArray。
    【解决方案3】:

    您可以立即使用 NSMutableArray 而不是 NSArray 并转换为 NSMutableArray 并确保您的 pList 是 Array 类型。您的代码如下所示:

    -(void)recordValues:(id)sender {
    // read "propertyList.plist" values
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"propertyList" ofType:@"plist"];
    //create an NSMutableArray containing the
    //user's score and the values from originalArray
    NSMutableArray *array = [NSArray arrayWithContentsOfFile: path];
    [newArray addObjectsFromArray:array];
    //check-out the content
    NSLog(@"The content of the array: %@", array);
    //write xml representation of mutableArray back to propertyList
    [array writeToFile:plistPath atomically:NO];
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      相关资源
      最近更新 更多