-1

嗨,我有以下格式的 plist在此处输入图像描述

我想根据它们的类别 ID 对这些书进行排序。我有一个包含所有类别 id 的数组“TotalCategory”(例如:cat1,cat2 ..),我想打开下面的 plist 并检查每本书及其类别 id 是否匹配。如果我拥有的类别 id 是与给定书籍的类别 ID 匹配,然后我想将该类别 ID 和书籍 ID(出价)添加到新字典中。有可能吗?

NSDictionary *booksPlist = [[NSDictionary alloc] initWithContentsOfFile:path];
NSArray *categoryId=[[booksPlist objectForKey:@"catlist"]valueForKey:@"cid"];
NSLog(@"%@",categoryId);

// getting category list

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *allBooksPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Allbooks.plist"];
NSDictionary *allBookPlist=[[NSDictionary alloc]initWithContentsOfFile:allBooksPath];

NSArray *bookid=[[allBookPlist objectForKey:@"listbook"]valueForKey:@"bid"];
NSString *s=[[[allBookPlist objectForKey:@"listbook"]objectForKey:@"cate" ]valueForKey:@"categories"];  //// this line shows exception


 NSLog(@"%@",s); 

/// 我想要这个 ::: 我想和我一起检查类别 id 和每本书中的类别 id,如果匹配,然后检索该书 id(出价)就是它

4

1 回答 1

1

您的要求不是很清楚,但我发现您的代码存在一些问题。

首先,不要将 的-objectForKey:方法NSDictionaryvalueForKey:非正式协议的方法混淆NSKeyValueCoding

后者用于KVC访问,最好不要在不知情的情况下混合它们。它可能会起作用,但在某些情况下也可能会爆炸。坚持objectForKey:或更好地使用现代订阅语法

[dict objectForKey:@"whatever"];

相当于

dict[@"whatever"];

也就是说,让我们面对你的具体问题。首先listbook是一个数组,所以你不能做

[[allBookPlist objectForKey:@"listbook"]valueForKey:@"bid"];

您需要首先访问数组元素,因此在现代语法中您应该这样做

NSString * bookId = allBookPlist[@"listbook"][0][@"bid"];

获取bid第一个元素的。如果你想收集它们,只需在数组上迭代

NSArray * books = allBookPlist[@"listbook"];
NSMutableArray * bookIds = [@[] mutableCopy]
for (NSDictionary * book in books) {
     [bookIds addObject:book[@"bid"]];
}

可以使用类似的方法从每本书中获取类别。

于 2013-04-09T00:36:57.217 回答