2011-06-25 15 views
1

現在のビューコントローラーが開く他のビューコントローラーへの参照を格納する価値はありますか? popoverviewcontrollerを開くボタンを持つ画面を表示するViewControllerが1つある場合は、その参照を保持してから、変数がnilであるかどうかを確認してpopoverviewcontrollerを1回だけ作成する必要がありますか?それとも不要ですか?いくつかのケースでは余分な変数や追加のコードにつながりますが、もし不要であると誰かが言うことができれば素晴らしいでしょう。他のビューコントローラーへの参照を保持するのは正常ですか?

if (self.popoverVC == nil) { 
    UIPopoverController *popVC = [[UIPopoverController alloc] initWithContentViewController:self.configureTest]; 
    popVC.popoverContentSize = CGSizeMake(320.0, 460.0); 
    popVC.delegate = self; 

    self.popoverVC = popVC; 
    [popVC release]; 
} 

答えて

3

他のコントローラへの参照を保存するのは私にとってはうまく、私にとっては妥当と思われるときはいつでも実行します。コントローラ間の相互作用をモデル化する手段として、delegate patternを考えてください。

しかし、選択肢があります。

具体的には、コントローラへの参照を保存する代わりに、ボタンが押されたことを示すフラグを設定できます(特定のワークフローには意味があるかどうかわかりません)。

あなたのケースでは該当しませんが、一般的にはUIViewControllerの「親」階層にアクセスすると便利です。これはUIKitによって明示的に管理されているわけではないので、parentViewControllerプロパティを設定するか、あるコントローラからその親に移動してUIResponder階層をナビゲートすることができます。これはあなたのケースには当てはまりません。私のように見えます。なぜなら、子コントローラが通信を開始するからです(あなたの場合、あなたは反対に興味があります)。あなたが興味を持っているなら、とにかく、それのためのGoogle。

あなたが持っているもう1つのオプションは通知を使用することです:1つのコントローラは通知のために登録することができ、別のコントローラは通知を通知することができます。

これは関数呼び出しよりも高価ですが、ivarとコントローラ間の結合は必要ありません。

2

特に、popVCが外観の間に状態を維持するようにしたい場合、これは完全に賢明です。 メモリ警告が発生した場合、非アクティブなvcを解放することをお勧めします。

1

UIPopoverController(UIViewControllerのサブクラスではない、NSObjectのサブクラスではありません)への参照を保持する理由は、UIViewControllerへの参照を保持するためのものとは少し異なります。

UIPopoverControllerを提示すると、自動的に保持されません。だからあなたは自分でそれを保持する必要があります。 UIViewControllerと比較すると、表示(またはプッシュ)すると自動的に保持されます。

参照を保持せずにコントローラを保持しただけのトリックがあり、ポップオーバーが解除されたことを通知するデリゲートメソッドで解放しました。

私にとっては、そのトリックはいつも少し汚いと感じました。たとえば、ポップオーバーを手動で解除するオプションがありませんでした。


ARCはLLVMページに公開されているため、ARCを使用するとそのトリックは機能しなくなります。参照を保持する必要があります。そうしないと、Popoverを提示するメソッドを終了した直後にコンパイラがそれを解放します。

関連する問題