• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Objective-c ナビゲーションコントローラ)

Objective-c ナビゲーションコントローラ

このQ&Aのポイント
  • iPhoneアプリ開発で、ナビゲーションコントローラを使った画面遷移を考えています。
  • ViewController1が表示されており、pushViewControllerでViewController2へ遷移します。
  • ViewController1で戻るボタンを検出し、[tableView reloadData];を実行したいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

※回答No.1は、決定的な誤りがあるので、無視してください。すみません。 UIViewControllerのメソッド「viewWillDisappear:」あるいは「viewDidDisappear:」を使って、ViewController2のビューが非表示になるタイミングで、ViewController1にメッセージを送ることになるでしょう。 あなたがオリジナルのDelegateを作成できるのであれば、以下の説明は不要ですが、そうでなければ、Delegateもどきのプログラムを紹介します。 ViewController2に、プロパティ「delegate」を作成します。変数名はなんでもいいですが、Delegateもどきなので、delegateとしておきます。 @property (nonatomic, retain) id delegate; ViewController1からViewController2にPushするとき、delegateにViewController1インスタンスを代入します。 ViewController2 *controller = [[tViewController2 alloc] initWithNibName: @"ViewController2" bundle: nil]; controller.delegate = self; [self.navigationController pushViewController: controller animated: YES]; [controller release]; ViewController2に「viewWillDisappear:」メソッドを追加します。(「viewDidDisappear:」でもいいかもしれません) - (void)viewWillDisappear:(BOOL)animated { ViewController1 *controller = (ViewController1 *)self.delegate; [controller reloadTable]; } ViewController1につぎのインスタンスメソッドを追加します。 - (void)reloadTable { [tableView reloadData]; } これら以外に「#import ~」を追加するなど、細々した処理が必要ですが、ビルド時になにが不足しているか指摘してくれるので、しれに従って追加してください。 なお、教えてgooでは、アットマークを使うと、危険な内容の可能性ありで審議中になってしまうので、全角の「@」に置き換えてあります。

jjk65536
質問者

お礼

回答ありがとうございました。 お礼が遅くなって申し訳ありません。 @で審議って意味わからないですね。 隠語でもあるんでしょうか。 viewWillDisappearでViewController1に トリガーとなるメッセージを送信してやれば いいんですね。 丁寧に解説していただきありがとうございました。 おかげさまでしっかり理解できたと思います。 ありがとうございました。

その他の回答 (1)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

UINavigationControllerには、Delegate Protocolがあります。 UINavigationControllerDelegate Protocol Reference http://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationControllerDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UINavigationControllerDelegate Delegateの実装場所を、ViewController1にしておけば、画面遷移が起こるたびに、Delegateメソッドが呼び出されます。 いうまでもありませんが、ViewController1は、常時存続しているインスタンスでなければいけません。つまりRoot ViewControllerであることが条件です。Push、Popによって、生成されたり開放されたりするViewControllerインスタンスであってはいけません。(ぜったいダメということはないでしょうが、きっと煩雑な処理を伴うことになるでしょう) UINavigationControllerDelegateにはふたつのメソッドがありますが、画面遷移が起こる前、起こった後の違いだけです。仮に「navigationController:willShowViewController:animated:」のほうを使って説明します。 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if ([navigationController.title isEqualToString: @"View 2"]) { [self.tableView reload]; } } 遷移前のViewControllerが「ViewController2」であることを識別するために、そのタイトルを使っていますが、識別の手段はほかにもいろいろあるでしょう。