2012-05-04 30 views
4

私はAppをStoryboardsに移動しています。カスタムスタックを使用してナビゲーションスタックで後方に移動する

しかし、私は本当に理解していないと私が心配しているものを見つけました。私は誰かがこれについていくつかの洞察を提供することができれば感謝します。

私のアプリは通常のナビゲーションコントローラを使用しています。新しいView Controllerに「前方」を移動するために、私はカスタムセグを使用しています。そこに問題はありません。しかし、アプリケーションには、ナビゲーションスタックの先頭に戻ってほしいという点があります。また、カスタムセグを使用してその「ナビゲーション」を設定しました。そのために、最後のビューコントローラを最初のものにドラッグしてInterface Builderでセグを作成しました。次の方法でメソッドを実行します。

-(void)perform 
{ 
    UIViewController *src = (UIViewController *)self.sourceViewController; 
    UIViewController *dest = (UIViewController *)self.destinationViewController; 

    [src.navigationController popToRootViewControllerAnimated:NO]; 
    // Custom animation code here 
} 

...素晴らしいです。しかし、私はそれがなぜ機能するのか分かりません。私の考えでは、カスタムsegueは、最初のView Controllerの新しいインスタンスをインスタンス化し、それを "dest"として割り当てる必要がありますが、segueはスマートで、以前の、存在するインスタンスのaコントローラを表示し、新しいインスタンスを作成する代わりに、既存のインスタンスを「dest」に割り当てます。

このようにセグを使用しても問題ないのは誰でも知っていますか?それは偶然にも機能する可能性がありますが、将来は機能しなくなる可能性がありますか? SegueがView Controllerをインスタンス化しているので、私はとにかくメモリを浪費していますか?使用しないでしょうか?

ありがとうございます!

答えて

2

  • セグエは、私が使用するつもりはないビュー コントローラをインスタンス化されたとして、私はとにかくメモリを無駄ですか?

はいサー!セグを使用することによって、カスタムセグの DestinationControllerプロパティを設定するのに必要な新しいビューコントローラを効率的に割り当てることができます。自分でテストする:静的カウンタをルートコントローラに追加し、このクラスが初期化され、ビューに表示されるたびにインクリメントします。このトリックを使用してルートにポップするたびにインクリメントされます。

  • このようにseguesを使用してOKであれば誰もが知っていますか?

実際にメモリを浪費している限り、 はありません。あなたの(void)perform implentationにセグエのDestinationControllerをリリース:

は、この問題に対する少なくとも一つの解決策があります。これは実際に実装するのが速いですが、毎回View Controllerを割り振り、すぐに解放するのでちょっと醜いのです。たとえそれが漏れているよりも優れていても、それは私が良い習慣と呼ぶものではありません! あなたが望むものを達成するためのよりよい方法は、そのトランジションにセグを使用しないことです。ただボタンなどを使用して、このボタンをタッチするときはpopToRootViewController:animatedと呼んでください。

  • は、それは偶然に動作しますが、 将来的に動作を停止する可能性があることは可能ですか?
私が提案した最初の解決方法と現在行っている方法の両方について、私は絶対に理由はないと考えています。これらは複雑な調整ではなく、単に「悪い実装」の標準ナビゲーションです。 2番目の解決策は完全に正常ですので心配はありません。

+0

ありがとうございました!あなたは私が疑うものを確認しました。静的なカウンターについてあなたが言及したトリックが100%確実であることを忘れていました。将来のニーズに留意してください。その解決策として、私はセグメントなしで「逆方向」のナビゲーションを実装しますが、ストーリーボードはそれほどクリーンではありません:) – flainez

+0

@psycoこれはARCとどのように機能しますか?どのようにDestinationControllerをリリースしますか? – Lucas

関連する問題