所以,我有一个描述多种美食的plist。在我的plist中,我有26个数组,每个数组都有一个字母的字母键。在这些阵列中,包含多种美食,这些都是字典。在每本字典中都有2个字符串,一个用于烹饪名称,另一个用于描述菜肴。我非常接近在表视图控制器中实现它,但我有一些问题。主要问题是访问名称并将其放在一个数组中,以便它可以用来告诉每个部分有多少行,该部分是字母表中的每个字母。我一直收到错误:" - [_ NSArrayI长度]:无法识别的选择器发送到实例...
非常感谢帮助。感谢
这就是我所拥有的:
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (tableView.tag == 1){
NSString *key = keys[section]; //returns the key(letter) for the section
NSDictionary *content = cuisines[key]; //returns the dictionary that consists of name and description
NSString *name = [content valueForKey:@"name"];
NSMutableArray *keyValues = [@[] mutableCopy];
[keyValues addObject:name];
return [keyValues count];
}else{
return [filteredcuisines count];
}
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if (tableView.tag == 1) {
return [keys count]; //Return the amount of letters for the number of sections
}else{
return 1;
}
这里还有我的字典看起来如何: http://imageshack.com/a/img835/9567/kkv7.png
这是我的搜索条形码。我需要将我所做的更改纳入我的plist。
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
[filteredcuisines removeAllObjects];
if (searchString.length>0) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", self.searchBar.text];
for (NSString *key in keys) {
NSArray *matches = [cuisines[key] filteredArrayUsingPredicate:predicate];
[filteredcuisines addObjectsFromArray:matches];
}
}
return YES;
}
答案 0 :(得分:0)
看起来像"内容"你从美食[关键]得到的应该是一个数组,而不是字典。它还不清楚您尝试使用keyValues数组做什么。我认为你的方法可以简化为这个,
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (tableView.tag == 1){
NSString *key = keys[section];
NSArray *content = cuisines[key];
return content.count;
}else{
return [filteredcuisines count];
}
}
我假设您在字典上使用调用allKeys获取密钥,然后按字母顺序排序。如果是这样,那么你可以用cellForRowAtIndexPath获取你的表视图的名称,
NSArray *arrayForSingleLetter = self.cuisines[keys[indexPath.section]];
cell.textLabel.text = arrayForSingleLetter[indexPath.row][@"name"];
必须将过滤数组修改为类似的内容,
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
[filteredcuisines removeAllObjects];
if (searchString.length>0) {
NSArray *arrayForSingleLetter = self.cuisines[[searchString substringToIndex:1]];
NSIndexSet *indxs = [arrayForSingleLetter indexesOfObjectsPassingTest:^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
return [dict[@"name"] rangeOfString:searchString].location != NSNotFound;
}];
[indxs enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
[filteredcuisines addObject:arrayForSingleLetter[idx][@"name"]];
}];
}
return YES;
}