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を意味します。