0

私はBUIViewControllerを持っていて、中に閉じるボタンがあります。

        -(IBAction) close:(id) sender 

ビューコントローラーから私はこのようにBビューコントローラーを提示します

  [self presentViewController:B animated:YES completion:NULL];

その後、すべてOKです。B内の閉じるボタンを押すことができます。

しかし、私がそうするなら

   B* bcontrol=[[B alloc] init];
   [self.view addsubview bcontrol.view];

このように、閉じるボタンを押すと、EXEC_BAD_ACCESSエラーが発生します。

何故ですか?何か案は?

4

2 に答える 2

1

あなたはARCを使用していると思います。

bcontrolをローカル変数として作成し、それへの参照を保持しないため、ビューを削除するとARCはbcontrolを解放します。次に、ボタンは割り当て解除されたオブジェクトでアクションをトリガーしようとします...そしてあなたは残りを知っています。

Bを強力なプロパティにして、ビューが必要なときにBが周囲にとどまるようにします。

于 2012-07-03T01:24:11.060 に答える
0

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

于 2012-07-03T01:29:14.743 に答える