0

これが他のスレッドと重複していたら申し訳ありません。私は数時間にわたって約 12 を調べましたが、私の状況に完全に当てはまるものはないようです。つまり;

  1. ボタンはポップオーバーを表示します
  2. ポップオーバーには、ナビゲーション コントローラー内にネストされたテーブル ビューが含まれています
  3. ユーザーはナビゲーション コントローラーの 2 番目のレベル (2 番目の tableViewController) に移動し、選択を行います。
  4. 選択すると、ポップオーバーが閉じて、indexPath.row が元の画面に返されます。

重要なのは、これを行うためにストーリーボードとセグエを使用していることです (これが問題の一部である可能性があります!)。

これを行うためにカスタムデリゲートメソッドを実装しようとしましたが、どうしようもなく混乱しています。主な理由

a) 実際のデリゲートは 2 レベル離れており、いわばこの「チェーンの上流」を伝えるのに苦労しています。b) [segue destinationViewController] は、navigationController です。プロパティ(デリゲートなど)を取得または設定するために、含まれている実際のtableViewにフックを取得する方法がわかりません

これは誰にとっても意味がありますか?読み返してみると、この質問は私と同じくらい難解です。解読できる方、アドバイスいただける方、よろしくお願いします。

4

1 に答える 1

0

ナビゲーション コントローラー ( ) の viewControllers プロパティを使用して、実際のビュー コントローラー (テーブル ビューを持つ) にアクセスできますsegue.destinationViewController。このビュー コントローラーへのポインターを取得したら、そのデリゲートを設定します。次に でtableView:didSelectRowAtIndexPath、何かが選択されたことをデリゲートに通知すると、デリゲートはポップオーバーを閉じることができます。

編集:これはあなたのprepareForSegueにある可能性があります:

UINavigationController *navigationController = (UINavigationController *)segue.destinationViewController; // cast the destination to UINavigationController

SpeciesTableViewController *speciesViewController = [navigationController.viewControllers lastObject];
speciesViewController.delegate = self;

viewControllersUINavigationControllerのプロパティに関する Apple ドキュメント:

現在ナビゲーション スタックにあるビュー コントローラー。. . . ルート ビュー コントローラーは配列のインデックス 0、バック ビュー コントローラーはインデックス n-2、トップ コントローラーはインデックス n-1 にあります。ここで、n は配列内の項目の数です。

セグエを使用する場合、ルート ビュー コントローラーが唯一のビュー コントローラーであるため、lastObject は常にルート ビュー コントローラーを返します。

ここで、SpeciesTableViewController で種を選択すると、セグエがトリガーされ、SpeciesDetailViewController のデリゲートを設定する必要があることに注意してください。SpeciesDetailViewController ではdidSelectRowForIndexPath、デリゲートにメッセージを送信してポップオーバーを閉じることができます。

于 2012-08-24T19:25:47.883 に答える