Хорошо, я думаю, что понял, это похоже на хак, но это работает для моих целей:
Я использую раскадровку: у меня есть контроллер UITableview с UISearchBarDisplayController прямо поверх него.Нет кода, просто перетаскивайте.
Оттуда, я следовал этому руководству, чтобы заставить панель поиска искать правильно http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html
Однако prepareForSegue: позволило бы мне отображать только ячейку из оригиналамассив, не с массивом поиска.
Поэтому я использовал didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (savedSearchTerm) {
searchRowSelected = indexPath.row; //<-- the trick that worked
[self performSegueWithIdentifier:@"ShowDetail" sender:self];
}
}
searchRowSelected - это переменная типа int, которую я объявил в верхней части класса.
didSelectRowAtIndexPath: знал, какой ряд я выбрал, но prepareForSegue - нет.Вот почему мне понадобилась эта переменная.
Вот как я использовал ее в prepareForSegue:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"ShowDetail"]) {
dvc = [segue destinationViewController];
NSIndexPath* path = [self.tableView indexPathForSelectedRow];
int row = [path row];
if (savedSearchTerm){ //set the detailViewController with the searched data cell
myDataClass* c = [searchResults objectAtIndex:searchRowSelected];
dvc.myDataClass = c;
}else{ //set the detailViewController with the original data cell
myDataClass* c = [array objectAtIndex:row];
dvc.myDataClass = c;
}
}
}
Также используйте этот код для очистки SavedSearchTerm
-(void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{
[self setSavedSearchTerm:nil];
}
Если кто-нибудьесть лучшее решение, я все уши:)