Основы
Когда вы читаете массив из этого списка, он выглядит следующим образом:
(
{
"site" = "http://yahoo.com",
"title" = "Yahoo"
},
{
"site" = "http://google.com",
"title" = "Google"
},
…
)
Это массив, элементы которого являются словарями, каждый словарь содержит два ключа и соответствующие им значения.
Когда вы используете метод KVC -valueForKey:
для массива, передающего ключ title
, он возвращает другой массив, элементами которого являются значения, соответствующие этому ключу:
(
"Yahoo",
"Google",
…
)
Полученный массив не содержит ссылку на исходный массив.
Проблема
В -handleSearchForTerm:
вы получаете массив, содержащий только заголовки из исходного массива. Для каждого заголовка вы выборочно добавляете его в массив searchResults
:
for (NSString *currentString in [[self contentsList] valueForKey:@"title"])
{
…
[[self searchResults] addObject:currentString];
}
Это означает, что searchResults
- это массив, содержащий список заголовков, которые не связаны автоматически с соответствующими словарями в массиве contentList
.
Похоже, вы хотите сохранить исходный словарь, потому что вы пытались создать словарь:
// NSDictionary *dic= [[NSDictionary alloc]allKeysForObject:searchResults];
и другим способом вы пытаетесь получить значение, соответствующее клавише site
:
NSString *arraySite = [[[self searchResults] objectAtIndex:indexPath.row]
valueForKey:@"site"];
Как уже упоминалось, ваш searchResults
содержит список строк, представляющих заголовки. Когда вы получаете элемент из этого массива, это всего лишь строка - следовательно, -valueForKey:@"site"
не имеет смысла, и Какао предупреждает вас, что строка не соответствует значению ключа для ключа site
.
Одно решение
Из того, что я могу сказать, вы должны хранить в своем массиве searchResults
исходный словарь, считанный из файла plist. В -handleSearchForTerm:
выполните следующие действия:
for (NSDictionary *currentSite in [self contentsList])
{
NSString *title = [currentSite objectForKey:@"title"];
if ([title rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound)
{
[[self searchResults] addObject:currentSite];
}
}
Теперь каждый элемент в searchResults
- это словарь, содержащий site
и title
.
В -tableView:didSelectRowAtIndexPath:
используйте словарь для получения соответствующего site
:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSDictionary *selectedSite = [[self searchResults] objectAtIndex:indexPath.row];
NSString *siteStringURL = [selectedSite objectForKey:@"site"];
// or, if you prefer everything in a single line:
// NSString *siteStringURL = [[[self searchResults] objectAtIndex:indexPath.row] objectForKey:@"site"];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:siteStringURL]]];
[self performSelector:@selector(showSearch:) withObject:nil afterDelay:0];
}