5

したがって、ストーリーボードを使用すると、UITableViewCell から最初の tableViewController から detailViewController へのセグエを作成できます。

それほど複雑ではありませんが、UISearchBarDisplayController がストーリーボード ミックスに導入された場合、どのように結果セルを detailViewController にセグエできますか?

問題なく検索できました。次のチュートリアルに従いました: http://cliningtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

私ができることは、検索から行を選択することだけです。それは青色になり、detailViewController には移動しません。

検索されていないセルに対して機能するメソッド prepareForSegue を実装しましたが、これを理解できません。

4

3 に答える 3

2

私はあなたの解決策を試してみましたが、ライフサイクルと didSelect... -> performSegueWithIdentifier のために prepareForSegue が 2 回呼び出されることがわかりました。

  1. self:prepareForSegue: 宛先コントローラーのオブジェクトが設定されています (間違ったインデックスで)。
  2. dest:viewDidLoad: 宛先コントローラー ビューが読み込まれ、その後
  3. self:didSelectRow...: インデックスは既知であり、適切に設定されています。
  4. self:prepareForSegue: オブジェクトは正しくなりましたが、副作用はありません。

次に、didSelect... に注目し、セグエを削除してプログラムでビューをプッシュするこのソリューションを思いつきました。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DestTableViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestViewController"];

    CustomObj *custObj = nil;

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        custObj = [filteredListContent objectAtIndex:indexPath.row];
    } else {
        storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
    }

    controller.custObj = custObj;

    [self.navigationController setNavigationBarHidden:NO];
    [self.navigationController pushViewController:controller animated:YES];
    // presentViewController::animated:completion is always full screen (see problem below)
}

その後、mapView からのセグエをたどったため、次のような問題が発生しました。

//DestinationViewController
- (IBAction)back:(id)sender
{
    [self.navigationController popToRootViewControllerAnimated:YES]; // list
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; // map
}

これはそれを行う方法ではありませんが、今のところ機能します。

しかし、最初の部分は簡単できれいです。

于 2012-04-06T20:50:50.757 に答える
0

わかりました。ちょっとしたハックのように思えますが、私の目的には適しています。

私はストーリーボードを使用しています: 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];
}

誰かがより良い解決策を持っているなら、私はすべて耳にします:)

于 2012-02-17T19:58:13.797 に答える