读取属性列表时出错
Posted
技术标签:
【中文标题】读取属性列表时出错【英文标题】:Error reading a property list 【发布时间】:2013-06-13 19:27:27 【问题描述】:我有一个属性列表,它的根有一个字典,有 21 个数组作为行,按相应的键排序。 每个键都有 8 个字符串的数组(值)。 像这样的:
Root Dictionary (21 items) "#14" Array (8 items) "#12" Array (8 items) Item 0 String 0.164 Item 1 String 0.123 item 2 String 0.211
....等等
在我的实现文件中,我有:
`- (void)loadTable9NECWithBundle:(NSBundle *)bundle
bundle = [NSBundle mainBundle] ; if (bundle != nil) /* Read the cable table data from the disk in a dictionary of arrays. Each array contains > only one cable size data. */ NSString *CableData = [bundle pathForResource:@"Table9-NEC" ofType:@"plist"]; NSDictionary *tableDict = [NSDictionary dictionaryWithContentsOfFile:CableData]; NSString *datos = nil; NSEnumerator *enumerator = [tableDict keyEnumerator]; id key; while ((key = [enumerator nextObject])) oneCableSizeDataArray = [[NSMutableArray alloc] initWithObjects:[tableDict > valueForKey:key] ,nil]; NSLog(@"key is %@ ", key); datos = [oneCableSizeDataArray objectAtIndex: 0 ]; NSLog(@"value is %@ ", datos);
控制台清楚地显示我可以正确地遍历所有键,但是数组 oneCableSizeDataArray 将值作为单个字符串获取,而不是 plist 文件表示中的 8 字符串。这意味着 [oneCableSizeDataArray count] 返回 1。(单个对象)。
我不知道为什么会这样。 任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:我现在不在 Mac 上进行 ios 开发,但据我记得你不想使用dictionaryWithContentsOfFile
,你想使用propertyListWithData:options:format:error:
,否则它不会加载嵌套属性正确。该消息的结果可以分配给NSDictionary
对象并像往常一样访问。 (说起来,最近的 Xcode 版本支持更简洁的索引和键访问,例如oneCableSizeDataArray[0]
和tableDict["#14"]
。)
【讨论】:
实际上属性列表是在 Xcode 中手动创建的,它基本上是不可变的,没有用户可以访问,并且该应用程序适用于 iOS。我会尝试研究您提到的内容并报告任何好消息。 更新:我只是将 oneCableSizeDataArray 的初始化从 oneCableSizeDataArray = [[NSMutableArray alloc] initWithObjects:[tableDict valueForKey:key] ,nil];到 initWithArray... 在这种情况下,阵列已正确配置。是的,oneCableSIzeDataArray[0] 工作得很好。感谢 JAB。 @user1544073 你甚至不需要initWithArray
、datos = [[tableDict valueForKey:key] objectAtIndex:0];
(或者在最近的Xcode版本中是datos = tableDict[key][0];
)就可以正常工作。事实上,我建议使用该方法,因为它可以减少不必要的代码和内存使用,除非您需要能够改变从属性列表中检索到的元素(尽管不一定要改变属性列表本身)。
另请注意,最好使用快速枚举 (for (id key in dict)
),而不是使用外部迭代器。您也可以尝试使用块 (developer.apple.com/library/mac/#documentation/Cocoa/Reference/…) 进行枚举,尽管这可能有点难以掌握(而且我不确定它是否比快速枚举更有效)。
说到枚举,你知道在NSUserDefaults中枚举键值的方法吗?以上是关于读取属性列表时出错的主要内容,如果未能解决你的问题,请参考以下文章
使用 ref 获取组件位置时出错(ReactCannot 读取属性 'getBoundingClientRect' of null")
使用 useeffect 和 useref TypeError 时出错:无法读取 null 的属性“getBoundingClientRect”
尝试从要显示在 ListView 中的字符串列表中读取项目时出错