わかりました。ちょっとしたハックのように思えますが、私の目的には適しています。
私はストーリーボードを使用しています: UISearchBarDisplayController を直接その上に持つ UITableview コントローラーがあります。コードはドラッグ アンド ドロップするだけです。
そこから、このチュートリアルに従って、検索バーで正しく検索できるようにしましたhttp://cliningtoideas.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];
}
誰かがより良い解決策を持っているなら、私はすべて耳にします:)