closeメソッドのコードを提供しません。このclose新しいビューへの移行方法に対応するように、メソッドコードを変更する必要があります。経由でコントローラーBを表示するようになったpresentViewController場合は、おそらく次の経由でAに戻ります。
- (IBAction)close:(id)sender
{
[self dismissViewControllerAnimated:YES completion:nil];
}
次に、経由してBコントローラーに移動するかどうかを検討します。
B* bcontrol=[[B alloc] init];
[self.view addsubview bcontrol.view];
明らかに、はもう機能しdismissViewControllerAnimatedません。closeしたがって、問題は、メソッドを何に変更したかです。
しかし、その前に、この構造には2つの問題があります。まず、ARC以外のプロジェクトでこれを行うと、コントローラーがリークします。さらに悪いことに、ARCでこれを行うと、コントローラーがスコープ外になると解放されるため、例外が発生します(ゾンビをオンにすると、意味のあるエラーが表示されます)。この問題の一般的な答えはB* bcontrol、Aのand ivarを作成するか、このようなことを行って、へのポインターbcontrolが解放されないようにすることです。これにより、当面の問題が解決されます。
次に、より大きな問題は、ビューコントローラー階層とビュー階層が同期していないため、この構成全体(コントローラーのビューを別のビューのサブビューとして追加する)は一般的に適切ではないということです。(これらの問題の詳細については、View ControllerContainmentのWWDC2011セッション102をご覧ください。)ローテーションイベントが発生しない場合があります。他に何が起こるかわかりません(iOSは、さまざまなコントローラーにメッセージを送信するためにView Controller階層をナビゲートできると想定しているため)。結論として、別のView Controllerのビューを取得して、それを現在のビューのサブビューとして追加することはお勧めできません。これを行うのは、本物のView Controllerの封じ込めを行ってaddChildViewControllerおり、didMoveToParentViewControllerそして、最初のビューを表示したいだけです(前述のビデオを参照)。
しかし、あなたが[self.view addSubview:bcontrol.view];構築を行うことを決心しているなら、明らかにあなたはdismissViewControllerAnimatedあなたのBのclose方法で同じものを使うことはできません。AのビューからBのビューを削除する論理的な方法は次のようになります[self.view removeFromSuperView];。ただし、Aクラスが最初に作成したBインスタンスをクリーンアップするようにする方法に課題があります。そうしないと、リークが発生します。
結論として、これは良い考えではありません。presentViewController(で却下するdismissViewControllerAnimated)またはpushViewController(で却下する)に固執するか、ViewControllerのpopViewControllerAnimated封じ込めを使用します。「閉じる」ボタンのアイデアについて話し合うとすると、それは、presentViewControllerまたはpushViewControllerモデルのいずれかに実際に役立つUIを意味します。